被卡常了,求助
查看原帖
被卡常了,求助
99506
_LHF_楼主2021/3/3 10:27

一下代码时间复杂度正确,但第九个点多跑了0.05秒(开O2)情况下,大佬们看一看有没有什么可以优化的地方,谢谢。

#include<cstdio>
#include<algorithm>
#define N 100010
#define ri register int
using namespace std;
const int mod=1e9+7;
int vis[N],p[N],mu[N],T,id[N],d[N],n,A,B,x,len;
long long g[N][10],f[N][10];
int k[N],h[N],lw[N],s[N],ans,pp[N],C,lx[N];
void dfs(ri x,ri y,ri k)
{
	int ss=0;
	for(ri l=1,r;l<=A;l=r+1)
	{
		r=min(A/(A/l),B/(B/l));
		ss=(ss+(g[r][k]-g[l-1][k]+mod)*f[A/r][k]%mod*f[B/r][k]%mod)%mod;
	}
	ans=(ans+1ll*ss*s[x]%mod)%mod;
	for(ri i=y+1;1ll*p[i]*x<=C&&i<=len;i++)
	{
		for(ri l=1,r;l<=A;l=r+1)
		{
			r=min(A/(A/l),B/(B/l));
			g[r][k+1]=(g[r][k]+g[r/p[i]][k+1])%mod;
			f[A/r][k+1]=(f[A/r][k]-f[A/r/p[i]][k]+mod)%mod;
			f[B/r][k+1]=(f[B/r][k]-f[B/r/p[i]][k]+mod)%mod;
		}
		dfs(x*p[i],i,k+1);
	}
}
int main()
{
	n=N-10;
	mu[1]=k[1]=h[1]=lw[1]=1;
	ri i,j;
	for(i=2;i<=n;i++)
	{
		h[i]++;
		if(!vis[i]) p[++len]=i,mu[i]=-1,lx[i]=lw[i]=i;
		for(j=1;j<=len&&i*p[j]<=n;j++)
		{
			lx[i*p[j]]=p[j];
			vis[i*p[j]]=1;
			lw[i*p[j]]=lw[i]*p[j];
			if(i%p[j]==0)
			{
				lw[i*p[j]]=lw[i];
				break;
			}
			mu[i*p[j]]=-mu[i];
		}
		for(j=i;j<=n;j+=i) h[j]++;
		k[i]=k[i-1]+mu[i];
		pp[i]=(i%(1ll*lx[i]*lx[i])!=0);
	}
	for(ri i=2;i<=n;i++) h[i]+=h[i-1];
	scanf("%d",&T);
	while(T--)
	{
		ans=0;
		scanf("%d%d%d",&A,&B,&C);
		if(A>B) swap(A,B);
		for(int l=1,r;l<=A;l=r+1)
		{
			r=min(A/(A/l),B/(B/l));
			g[r][1]=k[r];
			f[A/r][1]=h[A/r];
			f[B/r][1]=h[B/r];
		}
		for(ri i=1;i<=C;i++) s[i]=0;
		for(ri i=1;i<=C;i++) s[lw[i]]+=1ll*C/i,s[lw[i]]%=mod;
		dfs(1,0,1);
		printf("%lld\n",ans);
	}
}
2021/3/3 10:27
加载中...