1. 程式人生 > >51Nod-1040-最大公約數之和

51Nod-1040-最大公約數之和

ACM模版

描述

描述

題解

很有趣的一道題,尤拉函式原來還可以這麼玩~~~

既然是1~n與n的公約數,那麼肯定是n的因子。
每一個n的因子所對sum產生的增量為:gcd(n, i) = x(x為這個因子)的個數,也就是gcd(n / x, i / x) = 1的個數,這時,順理成章的也就想起了phi(n / x)了,求尤拉函式的方法多種多樣,但是這裡不能使用篩法,因為記憶體會爆掉的,只能單獨求解尤拉函式,並且在求n得因子上做一定的優化才行,注意sum必須是long long型別的哦。

程式碼

#include <iostream>
#include <cmath>
using namespace std; /* * 單獨求解的本質是公式的應用 */ unsigned euler(unsigned x) { unsigned i, res = x; // unsigned == unsigned int for (i = 2; i < (int)sqrt(x * 1.0) + 1; i++) { if (!(x % i)) { res = res / i * (i - 1); while (!(x % i)) { x /= i; // 保證i一定是素數
} } } if (x > 1) { res = res / x * (x - 1); } return res; } int main(int argc, const char * argv[]) { int N; cin >> N; long long sum = 0; for (int i = 1; i * i <= N; i++) { if (N % i == 0) { int
tmp = N / i; sum += euler(tmp) * i; if (i != tmp) { sum += euler(i) * tmp; } } } cout << sum << '\n'; return 0; }

相關推薦

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

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

[51nod] 1040 大公約數之和

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

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 大公約數之和

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

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)=

51nod 1040 大公約數之和 (數學)

給出一個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 <=

51Nod 1040 大公約數之和

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

[尤拉函式]51nod 1040 大公約數之和 題解

(傳送門) 題目大意 求∑i=1ngcd(i,n)\sum_{i=1}^{n}\ gcd(i,n)∑i=1n​gcd(i,n) 解題分析 注意,所有gcd(x,n)最後都是n的因數。所以可以對因數分類,

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

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

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

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

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

(尤拉函式應用)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 1188 大公約數之和 V2 題解

(傳送門) 題目大意 求∑i=1n−1∑j=i+1ngcd(i,j)\sum_{i=1}^{n-1}\sum_{j=i+1}^{n}gcd(i,j)∑i=1n−1​∑j=i+1n​gcd(i,j) 解題

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

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

51Nod 1040大公約數之和

Description Solution 分析題目可以發現,兩個數gcd(a,b)=x,則等價於gcd(ax,bx)=1,問題就可以轉化為滿足gcd(nx,ix)=1的i的個數,對答案貢獻就是個

51nod 1011 大公約數GCD

ytd ref style target sm2 lan shu fpm mys 9侔床乙撐6富f坎酌http://shufang.docin.com/vpe32249 寐4ree易V刮帕慘40http://www.docin.com/majo265 8氈誄20lb宋復

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]=