对于任意的>1的n gcd(a, b)不是n^2的倍数
也就是说gcd(a, b)没有一个因子的次数>=2
也就是说gcd(a, b)没有一个因子的次数>=2
标签:over gcd limit etc 质数 span limits geo png
HINT
T <= 10000
N, M<=4000000
题解:一个数不包含平方因子等价于mu(i)^2=1,所以可以推式子啦:
设$f(D)=\sum\limits_{D=1}^n\sum\limits_{d|D}\mu(d)^2\mu({D\over d}){D\over d}$,然后只要线性筛出f(D)就行了。
还是先考虑D是质数的k次方的情况,若$D=p$,则$f(D)=1 \times 1 \times 1+1 \times (-1) \times p=1-p$;若$D=p^2$,则$f(D)=0+1 \times -1 \times p+0$;若p的次数大于2呢?则$\mu(d)$和$\mu({D\over d})$中一定有一个等于0,所以f(D)=0。
然后就可以根据积性函数的性质线性筛了。
#include <cstdio> #include <cstring> #include <iostream> using namespace std; typedef unsigned int ui; const ui N=4000000; ui pri[N/10],np[N+10]; ui f[N+10],s[N+10],sum[N+10],ans,msk; ui num,T,n,m; inline ui rd() { ui ret=0; char gc=getchar(); while(gc<‘0‘||gc>‘9‘) {gc=getchar();} while(gc>=‘0‘&&gc<=‘9‘) ret=ret*10+gc-‘0‘,gc=getchar(); return ret; } int main() { ui i,j,p,last; f[1]=s[1]=sum[1]=1; msk=1,msk<<=30,msk--; for(i=2;i<=N;i++) { if(!np[i]) pri[++num]=i,f[i]=1-i; s[i]=s[i-1]+f[i]*i,sum[i]=sum[i-1]+i; for(j=1;j<=num&&i*pri[j]<=N;j++) { p=pri[j],np[i*p]=1; if(i%p==0) { if(i%(p*p)==0) f[i*p]=0; else f[i*p]=f[i/p]*(-p); break; } f[i*p]=f[i]*(1-p); } } T=rd(); while(T--) { n=rd(),m=rd(),ans=0; if(n>m) swap(n,m); for(i=1;i<=n;i=last+1) { last=min(n/(n/i),m/(m/i)); ans+=(s[last]-s[i-1])*sum[n/i]*sum[m/i]; } printf("%u\n",ans&msk); } return 0; }
标签:over gcd limit etc 质数 span limits geo png
原文地址:http://www.cnblogs.com/CQzhangyu/p/7516708.html