[51Nod1237]最大公約數之和-V3
題意
給定,求
解法
直接化式子:
下面有兩種(或許不止兩種)推導的方法,一種是莫比烏斯反演一下,這樣做的複雜度會是O()的,可以拿到一定的部分分,第二種方法就是對進行變化:
然後式子就變成了:,顯然後面的部分有O()種取值,那麼對進行數論分塊,然後求的過程就可以利用杜教篩了
複雜度
O()
程式碼
#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)=