一下代码时间复杂度正确,但第九个点多跑了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);
}
}