1. 程式人生 > >[51nod] 1040 最大公約數之和

[51nod] 1040 最大公約數之和

lose pre 函數 ref href image 需要 include 數字

1040 最大公約數之和

題目來源: rihkddd 基準時間限制: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 Input
1個數N(N <= 10^9)
Output
公約數之和
Input示例
6
Output示例
15
Analysis分析 這道題思考題 結論:         技術分享

為什麽呢?

主要思路:枚舉最大公約數,然後求出同個最大公約數的數字的數量

然後把這些加起來就行了

最後需要額外加上 1 和 n 的情況

那麽對於每個最大公約數,只要除去這個最大公約數,那麽數 a 和 n 就互質了

因此這個數量就是 技術分享

那麽對於每一個 n 的因數,我們都這麽疊加一下就行。

Code代碼

技術分享
 1 #include<cstdio>
 2 #include<iostream>
 3 #define LL long long
 4 using namespace std;
 5 
 6 LL x;
 7 
 8 LL euler(LL x){
 9     LL ans = 1;
10     for
(LL i = 2;i*i <= x;i++){ 11 if(x%i) continue; 12 ans *= i-1; 13 x /= i; 14 while(x%i == 0){ 15 ans *= i; 16 x /= i; 17 } 18 }if(x > 1) ans *= x-1; 19 return ans; 20 } 21 22 int main(){ 23 scanf("%I64d",&x);
24 25 LL tot = 0; 26 27 for(int i = 1;i*i <= x;i++){ 28 if(x%i) continue; 29 LL t = x/i; 30 tot += i*euler(t); 31 if(i != t) tot += t*euler(x/t); 32 }cout << tot; 33 34 return 0; 35 }
qwq 歐拉函數你好啊

[51nod] 1040 最大公約數之和