求助本题应该开的空间
  • 板块P2257 YY的GCD
  • 楼主bzzltl
  • 当前回复6
  • 已保存回复6
  • 发布时间2023/6/7 20:12
  • 上次更新2023/10/23 13:43:22
查看原帖
求助本题应该开的空间
699852
bzzltl楼主2023/6/7 20:12

数组应该是开到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;
}
2023/6/7 20:12
加载中...