《因子之和》的奇葩事件

我原来写 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 分,我突突突突突突突突然发现,我数组开小了。。。。

于是原来代码数组开大一点,直直直直直直接:


。。。

今日模考:
第一题是枚举数量少了
第二题是数组开小了
第三题是没有预处理

总结:
image
image
image

image

1 个赞