我原来写 30 分代码:
#include <bits/stdc++.h>
#define int long long
using namespace std;
struct node{
int l,r;
}a[200005];
int maxn;
int f[200005];
int gsum(int n){
int sum=1;
for(int i=2;i*i<=n;i++){
if(n%i==0){
int m=1;
while(n%i==0){
m*=i;
n/=i;
}
sum*=(m*i-1)/(i-1);
}
}
if(n>1){
sum*=(n+1);
}
return sum;
}
signed main(){
freopen("factors.in","r",stdin);
freopen("factors.out","w",stdout);
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].l>>a[i].r;
maxn=max(a[i].r,maxn);
}
for(int i=1;i<=maxn;i++){
if(gsum(i)>=2*i){
f[i]=1+f[i-1];
}else{
f[i]=f[i-1];
}
}
for(int i=1;i<=n;i++){
if(a[i].r<a[i].l){
cout<<0;
}else{
cout<<(f[a[i].r]-f[a[i].l-1]);
}
cout<<endl;
}
}
当考试结束后,我还在想,我难道时间复杂度算错了?这为啥过不了?
我丝毫没有观察到大大的 RunTime Error
随后老师讲调和级数,我也用了,还是 30 分,我突突突突突突突突然发现,我数组开小了。。。。
于是原来代码数组开大一点,直直直直直直接:
。。。