【数论】数表(P3312)
正題
P3312
題目大意
給出n,m,a,求∑i=1n∑j=1mσ(gcd(i,j))[σ(gcd(i,j))≤a]\sum_{i=1}^n\sum_{j=1}^m\sigma(gcd(i,j))[\sigma(gcd(i,j))\leq a]i=1∑n?j=1∑m?σ(gcd(i,j))[σ(gcd(i,j))≤a]
解題思路
先不考慮a的條件限制
∑i=1n∑j=1mσ(gcd(i,j))\sum_{i=1}^n\sum_{j=1}^m\sigma(gcd(i,j))i=1∑n?j=1∑m?σ(gcd(i,j))
∑d=1nσ(d)∑i=1n/d∑j=1m/d∑c∣i,c∣jμ(c)\sum_{d=1}^n\sigma(d)\sum_{i=1}^{n/d}\sum_{j=1}^{m/d}\sum_{c|i,c|j}\mu(c)d=1∑n?σ(d)i=1∑n/d?j=1∑m/d?c∣i,c∣j∑?μ(c)
∑d=1nσ(d)∑c∣i,c∣jμ(c)?ncd??mcd?\sum_{d=1}^n\sigma(d)\sum_{c|i,c|j}\mu(c)\left\lfloor\frac{n}{cd}\right\rfloor\left\lfloor\frac{m}{cd}\right\rfloord=1∑n?σ(d)c∣i,c∣j∑?μ(c)?cdn???cdm??
設k=cd,枚舉k
∑k=1n?nk??mk?∑d∣kσ(d)μ(kd)\sum_{k=1}^n\left\lfloor\frac{n}{k}\right\rfloor\left\lfloor\frac{m}{k}\right\rfloor\sum_{d|k}\sigma(d)\mu(\frac{k}ze8trgl8bvbq)k=1∑n??kn???km??d∣k∑?σ(d)μ(dk?)
對于后面一部分可以預處理出來
然后整除分塊即可
考慮a的限制條件,可以離線處理
先對a進行排序,只計算滿足條件的d,對于一段區間的和可以用樹狀數組
時間復雜度 O(Tnlogn)O(T\sqrt{n}\ log\ n)O(Tn??log?n)
code
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define N 100100 #define mod 2147483648 #define mp make_pair #define fs first #define sn second using namespace std; ll t,w,n,m,ans,now,g[N],f[N],p[N],c[N],qs[N],mu[N],prime[N]; pair<ll,ll>a[N]; struct node {ll n,m,a,v; }q[N]; bool cmp(node a,node b) {return a.a<b.a; } void work() {mu[1]=f[1]=1;for(ll i=2;i<=1e5;++i){if(!p[i]){prime[++w]=i;mu[i]=-1;f[i]=i+1;g[i]=i+1;}for(ll j=1;j<=w&&i*prime[j]<=1e5;++j){p[i*prime[j]]=1;if(i%prime[j]==0){g[i*prime[j]]=g[i]*prime[j]+1;f[i*prime[j]]=f[i]/g[i]*g[i*prime[j]];}else{mu[i*prime[j]]=-mu[i];g[i*prime[j]]=prime[j]+1;f[i*prime[j]]=f[i]*g[i*prime[j]];}}}for(ll i=1;i<=1e5;++i)a[i]=mp(f[i],i);sort(a+1,a+1+100000);return; } void add(ll x,ll y) {for(;x<=1e5;x+=x&-x)(c[x]+=y)%=mod;return; } ll ask(ll x) {ll sum=0;for(;x;x-=x&-x)(sum+=c[x])%=mod;return sum; } int main() {scanf("%lld",&t);for(ll i=1;i<=t;++i){scanf("%lld%lld%lld",&q[i].n,&q[i].m,&q[i].a);q[i].v=i;}sort(q+1,q+1+t,cmp);work();now=1;for(ll i=1;i<=t;++i){while(now<=1e5&&a[now].fs<=q[i].a){for(ll j=1;a[now].sn*j<=1e5;++j)add(a[now].sn*j,(a[now].fs*mu[j]%mod+mod)%mod);now++;}ans=0;n=q[i].n;m=q[i].m;for(ll l=1,r=0;l<=min(n,m);l=r+1){r=min(n/(n/l),m/(m/l));(ans+=(ask(r)-ask(l-1)+mod)%mod*(n/l)%mod*(m/l)%mod)%=mod;}qs[q[i].v]=ans;}for(int i=1;i<=t;++i)printf("%lld\n",qs[i]);return 0; }總結
以上是生活随笔為你收集整理的【数论】数表(P3312)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 哪些电脑专用桌面音箱受欢迎桌面电脑音箱推
- 下一篇: 怎样让他人电脑中病毒如何让电脑感染病毒