題面: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...