数组应该是开到1e7,题解中也是开到的这个数据,但是我在代码里开这么大的数组的时候,会直接编译不通过,通过不断二分发现只有当开到4365060才不至于不编译。但是只开到4365060时会导致RE和WA,然后使答案出错。
求助怎么修改。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=4365060;
const int M=1e3+7;
const int IM=2147483647;
const long long LLM=9223372036854775807;
inline int read()
{
int x=0,y=1;char c=getchar();
while(c<'0'||c>'9'){if(c=='-') y=-y;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+(c^'0');c=getchar();}
return x*y;
}
int k,cnt;
int p[N],F[N],mu[N]={0,1},vis[N];
void init()
{
for(int i=2;i<N;i++)
{
if(!vis[i]) p[++cnt]=i,mu[i]=-1;
for(int j=1;i*p[j]<N;j++)
{
vis[i*p[j]]=1;
if(i%p[j]==0) break;
mu[i*p[j]]=-mu[i];
}
}
for(int i=1;i<=cnt;i++)
for(int j=p[i];j<N;j+=p[i])
F[j]+=mu[j/p[i]];
for(int i=1;i<N;i++) F[i]+=F[i-1];
}
ll calc(int m,int n)
{
if(n>m) swap(n,m);
ll ans=0;
for(int l=1,r;l<=n;l=r+1)
{
r=min(n/(n/l),m/(m/l));
ans+=1ll*(F[r]-F[l-1])*(n/l)*(m/l);
}
return ans;
}
signed main()
{
init();
int T=read();
while(T--) printf("%lld\n",calc(read(),read()));
return 0;
}