數論 51nod1188 最大公約數之和 V2

2021-08-08 01:24:33 字數 1274 閱讀 7758

題面:51nod1188∑n

i=1g

cd(i

,n) 我們轉成了∑n

x|np

hi(n

/x)∗

x ,這題繼續用

本題要求∑n

i=1∑

i−1j

=1gc

d(i,

j),那我們可以先轉成∑n

i=1∑

i−1x

|iph

i(i/

x)∗x

我們再轉化一下就成了∑n

i=2∑

x∗y<=nx

=1ph

i(i)

∗x可以發現這個式子和上面那個是等價的(注意

i 從2開始列舉,因為題目說i≠

j這樣就可以避免加上ph

i(1)

∗x)

這個可以直接大力列舉

i 和

j,做個字首和就可以知道1~5e6之間的所有答案了

前一題是單點求phi,這題n比較小,直接大力尤拉篩出來就好了

最後離線詢問的複雜度是o(

t),預處理複雜度o(

5∗106

+???

) (據說是log我不會算),反正能過

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define int long long

using

namespace

std;

inline

int read()

while(ch>='0'&&ch<='9')

return k*f;

}const

int n=5e6;

int ans[n+10],pri[1000010],phi[n+10];

bool b[n+10];

inline

void get()

else phi[i*pri[j]]=phi[i]*(pri[j]-1);}}

}signed main()

return

0;}

其實這題我一眼是莫比烏斯反演qaq(差點嚇跑了)

51nod 1188 最大公約數之和 V2

給出乙個數n,輸出小於等於n的所有數,兩兩之間的最大公約數之和。本來和bzoj的2705有類似 改了改還是tle,發現有重複的地方 借鑑了下別人的 把核心求phi x y 拿出來預處理就好了 用了快讀優化 交第一次最後一點tle 交第二次就過了 最後乙個點1600 ms,不是很懂這個評測機。incl...

51nod 最大的最大公約數

這道題挺有意思,讓求最大的兩兩最大公約數,很顯然暴力直接做複雜度太高。可以利用試除法,列舉每乙個數的因子,如果某個因子出現超過了兩次,就可以進行判斷,因為題目要求兩兩。最大公約數一定是某個數的因子。include includeusing namespace std int cnt 50005 an...

51nod1179最大的最大公約數

題目大意 給出n個正整數,找出n個數兩兩之間最大公約數的最大值。例如 n 4,4個數為 9 15 25 16,兩兩之間最大公約數的最大值是15同25的最大公約數5。input 第1行 乙個數n,表示輸入正整數的數量。2 n 50000 第2 n 1行 每行1個數,對應輸入的正整數.1 s i 100...