1. 程式人生 > >[51Nod1237]最大公約數之和-V3

[51Nod1237]最大公約數之和-V3

題意

  給定n,求i=1nj=1ngcd(i,j)

解法

  直接化式子:

i=1nj=1ngcd(i,j)=d=1ndi=1nj=1n[gcd(i,j)=d]
  下面有兩種(或許不止兩種)推導的方法,一種是莫比烏斯反演一下,這樣做的複雜度會是O(n)的,可以拿到一定的部分分,第二種方法就是對i=1nj=1n[gcd(i,j)=d]進行變化:
i=1nj=1n[gcd(i,j)=d]=i=1ndj=1nd[gcd(i,j)=1]=2i=1ndφ(i)1=2ϕ(nd)1

  然後式子就變成了:d=1nd(2ϕ(nd)1),顯然後面的部分有O(n)種取值,那麼對d進行數論分塊,然後求ϕ的過程就可以利用杜教篩了

複雜度

O(n23)

程式碼

#include<iostream>
#include<cstdlib> #include<cstdio> #include<map> #define Rint register int #define Lint long long int using namespace std; const int m2=500000004; const int N=20001000; const int M=1e9+7; bool vis[N]; int pri[N/10],cnt; Lint phi[N]; map<Lint,int> f; void Prepare() { phi[1]=1; for(int
i=2;i<N;i++) { if( !vis[i] ) pri[++cnt]=i,phi[i]=i-1; for(int j=1;j<=cnt;j++) { int x=pri[j]*i; if( x>=N ) break ; vis[x]=1; if( i%pri[j] ) phi[x]=phi[i]*phi[pri[j]]; else { phi[x]=phi[i]*pri[j]; break ; } } } for(int i=1;i<N;i++) phi[i]=(phi[i]+phi[i-1])%M; } int cal(Lint n) { if( n<N ) return phi[n]; if( f.count(n) ) return f[n]; Lint x=2,ret=n%M*(n%M+1)%M*m2%M; while( x<=n ) { Lint y=n/(n/x); ret=(ret-1ll*(y-x+1)%M*cal(n/x)%M+M)%M,x=y+1; } return f[n]=ret; } int sum(Lint l,Lint r) { l%=M,r%=M; return (l+r)%M*(r-l+1+M)%M*m2%M; } int main() { Prepare(); Lint n,ans=0,x=1; scanf("%lld",&n); while( x<=n ) { Lint y=n/(n/x); ans=(ans+1ll*(2*cal(n/x)%M-1+M)%M*sum(x,y)%M)%M,x=y+1; } printf("%lld\n",ans); return 0; }

相關推薦

[51Nod1237]大公約數之和-V3

題意   給定nn,求∑ni=1∑nj=1gcd(i,j)∑i=1n∑j=1ngcd(i,j) 解法   直接化式子: ∑i=1n∑j=1ngcd(i,j)=∑d=1n

[莫比烏斯反演+杜教篩] 51Nod1237: 大公約數之和 V3

題意 求∑ni∑njgcd(i,j) n≤1010 題解 ∑in∑jngcd(i,j)=∑d=1n∑i=1n∑j=1n[gcd(i,j)=d]∗d=∑d=1n∑i=1⌊nd⌋∑j=1⌊nd⌋

[51NOD1237]大公約數之和 V3

題目大意 給定n,試求 ∑i=1n∑j=1ngcd(i,j) 結果對109+7取模。 2≤n≤1010 題目分析 我們將題目改為求 ∑i=1n∑j=1igcd(i,j) 然後將答

51nod1237 大公約數之和 V3

const clas 轉化 .com pre long cli play opened 題意:求 解: 最後一步轉化是因為phi * I = Id,故Id * miu = phi 第二步是反演,中間省略了幾步... 然後就這樣A了......最終式子是個整除

51nod 237 大公約數之和 V3 杜教篩

ace sin sig highlight n+1 brush print turn else Code: #include <bits/stdc++.h> #include <tr1/unordered_map> #define se

51nod1237 大公約數之和

odi cto for inline 51nod tor main font cpp 題目鏈接 題意 其實就是求 \[\sum\limits_{i=1}^n\sum\limits_{j=1}^ngcd(i,j)\] 思路 建議先看一下此題的一個弱化版 推一下式子 \[\su

51nod 1040 大公約數之和(歐拉函數)

wid con cst 都是 快的 .html lan inf log http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1040 題意: 思路:最大公約數肯定也是在1~n這個範圍裏的,

1040 大公約數之和(歐拉函數)

公約數 online cli 算法題 inf group mil mod += 1040 最大公約數之和 題目來源: rihkddd 基準時間限制:1 秒 空間限制:131072 KB 分值: 80 難度:5級算法題 給出一個n,求1-n這n個

[51nod] 1040 大公約數之和

lose pre 函數 ref href image 需要 include 數字 1040 最大公約數之和 題目來源: rihkddd 基準時間限制:1 秒 空間限制:131072 KB 分值: 80 難度:5級算法題 給出一個n,求1-n

51nod 1188 大公約數之和 V2

floor names log mes phi cst info printf body 第二個\( O(T\sqrt(n)) \)復雜度T了..T了..T了...天地良心,這能差多少?! 於是跑去現算(。 \[ \sum_{i=1}^{n-1}\sum_{j=i+1}^

51nod1040 大公約數之和

include std phi isp opened one 51nod play 分享圖片 求$\sum_{i=1}^{n}(i,n)$。n<=1e9。 $\sum_{i=1}^{n}(i,n)=\sum_{d|n}d\sum_{i=1}^{n}[(i,n)=d]=

FJUT3565 大公約數之和(容斥)題解

題意:給n,m,求出 思路:題意為求出1~m所有數和n的gcd之和。顯然gcd為n的因數。我們都知道gcd(a,b)= c,那麼gcd(a/c,b/c)= 1。也就是說我們列舉n所有的因數k,然後去找1~m/k中和n/k互質的個數就是gcd為k的個數。這個直接容斥就行。 程式碼: #include

(尤拉函式應用)1040 大公約數之和

1040 最大公約數之和 1 秒   131,072 KB   80 分   5 級題 給出一個n,求1-n這n個數,同n的最大公約數的和。比如:n = 6 1,2,3,4,5,6 同6的最大公約數分別為1,2,

51nod-1040 大公約數之和(尤拉函式)

基準時間限制:1 秒 空間限制:131072 KB 分值: 80 難度:5級演算法題  收藏  關注 給出一個n,求1-n這n個數,同n的最大公約數的和。比如:n = 6 1,2,3,4,5,6 同6的最大公約數分別為1,2,3,2,1,6,加在一起 = 15

51Nod-1040-大公約數之和

ACM模版 描述 題解 很有趣的一道題,尤拉函式原來還可以這麼玩~~~ 既然是1~n與n的公約數,那麼肯定是n的因子。 每一個n的因子所對sum產生的增量為:gcd(n, i) = x(x

51nod 1040 大公約數之和(尤拉函式)

水平較水,想不到,看的討論版 與n的公約數,肯定是n的因子 那我們列舉n的因子就好了 假設因子為x,那麼x的貢獻次數就是1-n有多少個數與n的gcd=x,即1-n/x有多少個數與n/x互質,即ph

【51NOD】 1040-大公約數之和(尤拉函式)

原題連線 首先補充一個知識點,尤拉函式: 在數論,對正整數n,尤拉函式是小於n的正整數中與n互質的數的數目(φ(1)=1)。此函式以其首名研究者尤拉命名(Euler’s totient function),它又稱為Euler’s totient f

[數論] 51Nod 1040 大公約數之和

推一推就是 sigma d|n d*phi(n/d) 那麼質因數分解 dfs出所有因數 #include<cstdio> #include<cstdlib> #include

51nod-1040-1040 大公約數之和(尤拉函式)

原題連結 給出一個n,求1-n這n個數,同n的最大公約數的和。比如:n = 6 1,2,3,4,5,6 同6的最大公約數分別為1,2,3,2,1,6,加在一起 = 15 Input

51nod 1040 大公約數之和

51nod 1040 最大公約數之和 解法一 尤拉函式: 由題意得,該題求Σ(n,i=1)gcd(i,n) 令gcd(i,n)=x,列舉n的因子x,最後答案為因子x乘以x出現的次數的和。 求gcd(n,i)=x出現的次數,即gcd(n/x,i/x)=