为什么这个代码会 TLE?
  • 板块灌水区
  • 楼主__vector__
  • 当前回复2
  • 已保存回复2
  • 发布时间2024/5/1 01:32
  • 上次更新2024/5/1 11:35:30
查看原帖
为什么这个代码会 TLE?
507348
__vector__楼主2024/5/1 01:32

刚刚的 D 题,我对 11 ~ 2⋅1062 \cdot 10^6 预处理所有因数,然后喜提 TLE on pretest1。
而程序记录因数总数就 3⋅1073 \cdot 10^7 个。

是不是赋值运算速度本来就很慢?

#include <bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for(int i=a;i<=b;i++)
#define REP(i,a,b) for(int i=a;i>=b;i--)
#define pb push_back
#define mkpr make_pair
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
int T;
template<class T>
void ckmx(T& a,T b){
    a=max(a,b);
}
template<class T>
void ckmn(T& a,T b){
    a=min(a,b);
}
int gcd(int a,int b){
    return !b?a:gcd(b,a%b);
}
int n,m;
const int maxn=2e6+5;
int* d[maxn];
int siz[maxn];
int top[maxn];
void solve(){
    scanf("%d%d",&n,&m);
    int ans=n;
    FOR(a,1,n){
        FOR(i,0,top[a]-1){
            int v=d[a][i];
            if(v>m)break;
            if(ll(a+v)%((ll)v*(ll)v)==0){
                ans++;
            }
        }
    }
    printf("%d\n",ans);
}
int main()
{
    FOR(i,2,maxn-1){
        for(int j=i;j<maxn;j+=i){
            siz[j]++;
        }
    }
    int tot=0;
    FOR(i,2,maxn-1){
        d[i]=(int*)malloc(sizeof(int)*(siz[i]+2));
        tot+=siz[i];
    }
    printf("%d\n",tot);
   // int cnt=0;
    for(int j=2;j<maxn;j+=2){
        d[j][top[j]++]=2;
    }

    FOR(i,3,maxn-1){
        for(int j=2*i;j<maxn;j+=i){
            d[j][top[j]++]=i;
         //   cnt++;
        }
    }
  //  printf("%d\n",cnt);
	scanf("%d",&T);
	while(T--){
		solve();
	}
	return 0;
}

2024/5/1 01:32
加载中...