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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

51nod1227-平均最小公倍数【杜教筛,欧拉函数】

發(fā)布時(shí)間:2023/12/3 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 51nod1227-平均最小公倍数【杜教筛,欧拉函数】 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

正題

題目鏈接:http://www.51nod.com/Challenge/Problem.html#problemId=1227


題目大意

定義
F(a)=∑i=1alcm(a,i)aF(a)=\frac{\sum_{i=1}^a lcm(a,i)}{a}F(a)=ai=1a?lcm(a,i)?
給出l,rl,rl,r∑i=lrF(i)\sum_{i=l}^rF(i)i=lr?F(i)


解題思路

好久沒做數(shù)論題了
直接拆成兩個(gè)前綴和的差,然后有
∑i=1n∑j=1ijgcd(i,j)\sum_{i=1}^n\sum_{j=1}^i\frac{j}{gcd(i,j)}i=1n?j=1i?gcd(i,j)j?
∑d=1n1d∑i=1n∑j=1ij[gcd(i,j)=d]\sum_{d=1}^n\frac{1}ozvdkddzhkzd\sum_{i=1}^n\sum_{j=1}^ij[gcd(i,j)=d]d=1n?d1?i=1n?j=1i?j[gcd(i,j)=d]
∑d=1n∑i=1?nd?∑j=1ij[gcd(i,j)=1]\sum_{d=1}^n\sum_{i=1}^{\lfloor\frac{n}ozvdkddzhkzd\rfloor}\sum_{j=1}^{i}j[gcd(i,j)=1]d=1n?i=1?dn???j=1i?j[gcd(i,j)=1]
12+∑d=1n∑i=1?nd?φ(i)i2\frac{1}{2}+\sum_{d=1}^n\sum_{i=1}^{\lfloor\frac{n}ozvdkddzhkzd\rfloor}\frac{\varphi(i)i}{2}21?+d=1n?i=1?dn???2φ(i)i?

函數(shù)H(n)=φ(n)nH(n)=\varphi(n)nH(n)=φ(n)n可以用杜教篩,H×idH\times idH×id就可以得到n2n^2n2的函數(shù)。


code

#include<cstdio> #include<cstring> #include<algorithm> #include<map> #define ll long long using namespace std; const ll N=5e6,P=1e9+7; ll cnt,pri[N/10],phi[N]; bool v[N];map<ll,ll> mp; void Prime(){phi[1]=1;for(ll i=2;i<N;i++){if(!v[i])pri[++cnt]=i,phi[i]=i-1;for(ll j=1;j<=cnt&&i*pri[j]<N;j++){v[i*pri[j]]=1;if(i%pri[j]==0){phi[i*pri[j]]=phi[i]*pri[j];break;}phi[i*pri[j]]=phi[i]*(pri[j]-1);}}for(ll i=1;i<N;i++)phi[i]=(phi[i]*i+phi[i-1])%P;return; } ll GetS(ll n) {return n*(n+1)/2%P;} ll GetSS(ll n) {return n*(n+1)%P*(2*n+1)%P*((P+1)/6)%P;} ll GetPhi(ll n){if(n<N)return phi[n];if(mp[n])return mp[n];ll ans=GetSS(n);for(ll l=2,r;l<=n;l=r+1){r=n/(n/l);(ans-=GetPhi(n/l)*(GetS(r)-GetS(l-1))%P)%=P;}mp[n]=ans;return ans; } ll solve(ll n){ll ans=0;if(!n)return 0;for(ll l=1,r;l<=n;l=r+1){r=n/(n/l);(ans+=(GetPhi(n/l)+1)*(r-l+1)%P)%=P;}return ans*((P+1)/2)%P; } signed main() {ll l,r,ans;Prime();scanf("%lld%lld",&l,&r);ans=(solve(r)-solve(l-1))%P;printf("%lld\n",(ans+P)%P);return 0; }

總結(jié)

以上是生活随笔為你收集整理的51nod1227-平均最小公倍数【杜教筛,欧拉函数】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。