刚刚的 D 题,我对 1 ~ 2⋅106 预处理所有因数,然后喜提 TLE on pretest1。
而程序记录因数总数就 3⋅107 个。
是不是赋值运算速度本来就很慢?
#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;
}