日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【数论】数表(P3312)

發布時間:2023/12/3 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【数论】数表(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=1n?j=1m?σ(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=1n?j=1m?σ(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=1n?σ(d)i=1n/d?j=1m/d?ci,cj?μ(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=1n?σ(d)ci,cj?μ(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}ozvdkddzhkzd)k=1n??kn???km??dk?σ(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)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。