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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

LOJ 6229 LCM / GCD (杜教筛+Moebius)

發(fā)布時(shí)間:2023/12/16 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 LOJ 6229 LCM / GCD (杜教筛+Moebius) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

鏈接:

https://loj.ac/problem/6229

題意:

\[F(n)=\sum_{i=1}^n\sum_{j=1}^i\frac{\mathrm{lcm}(i,j)}{\mathrm{gcd}(i,j)}\]

讓你求 \(F(n) \bmod1000000007\)

題解:

設(shè)\(\begin{align} f(n)=\sum_{i=1}^n\frac{lcm(i,n)}{gcd(i,n)}&=\sum_{i=1}^n\frac{n*i}{(i,n)^2}\\ &=\sum_{i=1}^n\sum_{d|n}[(i,n)=d]\frac{n*i}{d^2}\\ &=\sum_{d|n}\sum_{i=1}^{[\frac nd]}[(i,\frac nd)=1]\frac{n*i}d\\ &=\sum_{d|n}d\sum_{i=1}^d[(i,d)=1]*i\\ &=\frac 12(1+\sum_{d|n}d^2\varphi(d)) \end{align}\)

即求 \(\sum_{i=1}^n\sum_{d|i}d^2\varphi(d)=\sum_{i=1}^n\sum_{d=1}^{[\frac ni]}d^2\varphi(d)\)

\(\phi'(n)=\sum_{i=1}^ni^2\varphi(i)\)

因?yàn)?\(\sum_{d|n}d^2\varphi(d)*(\frac nd)^2=n^2\sum_{d|n}\varphi(d)=n^3\)

所以,

\(\begin{align} \sum_{i=1}^ni^3=[\frac{n(n+1)}{2}]^2&=\sum_{i=1}^n\sum_{d|i}d^2\varphi(d)*(\frac id)^2\\ &=\sum_{i=1}^ni^2\sum_{d=1}^{[ \frac ni]}d^2\varphi(d)\\ &=\sum_{i=1}^ni^2\phi'([\frac ni]) \end{align}\)

所以得到:\(\phi'(n)=[\frac{n(n+1)}{2}]^2-\sum_{i=2}^ni^2\phi'([\frac ni])\)

可以杜教篩先預(yù)處理前 \(n^{2/3}\),原問題可以在復(fù)雜度\(O(n^{2/3}log(n))\)內(nèi)解決。

整合一下,就是:

推公式可以得到( 結(jié)合公式4 ):\(ans=\sum_{d=1}^n\sum_{i=1}^{\lfloor{n\over d}\rfloor}\sum_{j=1}^i ij[\gcd(i,j)=1]\)

因?yàn)榇嬖诤愕仁?#xff1a;\(\sum_{i=1}^ni[\gcd(i,n)=1]={[n=1]+n\varphi(n)\over 2}\)

所以有:\(ans={n\over 2}+{1\over 2}\sum_{d=1}^n\sum_{i=1}^{\lfloor{n\over d}\rfloor}i^2\varphi(i)\)

考慮 \(\sum_{i=1}^{n}i^2\varphi(i)\)出現(xiàn)的次數(shù),可以得到: \(ans={n\over 2}+{1\over 2}\sum_{i=1}^ni^2\varphi(i)\lfloor{n\over i}\rfloor\)

其中,\(\sum_{i=1}^ni^2 = \frac{n\cdot(n+1)\cdot(2n+1)}{6}\)\(\varphi(i)\)為歐拉函數(shù)。

代碼:

#include <bits/stdc++.h>using namespace std; typedef long long ll; const int maxn = 1e6+100; const int mod = 1e9+7; int n; int p[maxn],phi[maxn],pre[maxn];int inv2,inv6; ll qpower(ll a,ll b,ll mod) {ll res = 1;while(b>0) {if(b&1) res = res * a % mod;b >>= 1;a = a * a % mod;}return res; } void init(int n) {phi[1]=1;for(int i=2;i<=n;i++){if(p[i]==0) p[++*p]=i,phi[i]=i-1;for(int j=1;j<=*p && 1LL*p[j]*i<=n;j++){p[p[j]*i]=1;if(i%p[j]) phi[i*p[j]]=phi[i]*phi[p[j]];else{phi[i*p[j]]=phi[i]*p[j];break;}}}for(int i=1;i<=n;i++) {pre[i]=(pre[i-1]+1LL*phi[i]*i%mod*i)%mod;} } map<ll,int> mp; int calcinv2(ll l,ll r) {l %= mod;r %= mod;return (r - l + 1) * (l + r) % mod * inv2 % mod; } int calcinv6(ll n) {n %= mod;return n * (n + 1) % mod * (2 * n + 1) % mod * inv6 % mod; } int calc2(ll l,ll r) {return (calcinv6(r) - calcinv6(l-1) ) % mod; } int calc3(ll n) {return 1LL * calcinv2(1 , n) * calcinv2(1 , n) % mod; } int S(ll n) {if(n <= 1e6) return pre[n];if(mp.count(n)) return mp[n];int res = calc3(n);for(ll i = 2, j; i <= n ;i = j + 1) {j = n / (n / i);res = (res - 1LL * calc2(i,j) * S(n / i)) % mod;}return mp[n] = res; } int main(int argc, char const *argv[]) {ll n;std::cin >> n;init(1000000);// 2/3inv2 = qpower(2,mod-2,mod);inv6 = qpower(6,mod-2,mod);int ans = 0;int last = 0;for(ll i = 1, j; i <= n; i = j + 1) {j = n /( n / i );int cur = S(j);ans = (ans + 1LL * (cur - last) * ( n / i)) % mod;last = cur;}ans = (ans + n) % mod * inv2 % mod;std::cout << (ans + mod) % mod << '\n';cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/LzyRapx/p/8459266.html

總結(jié)

以上是生活随笔為你收集整理的LOJ 6229 LCM / GCD (杜教筛+Moebius)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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