オリジナルタイトルリンク
http://acm.hdu.edu.cn/showproblem.php?pid=3501
N整数正考えると、あなたのタスクはN. Aに互いに素ではありません以下Nより大きい正の整数の合計を計算することであるA、Bを共有していない一般的な正の約数であれば1を除いてBに互いに素であると言われています。
入力
各テストケースについては、N(1≤N≤1000000000)整数正を含む行があります。単一の0を含む行は、最後のテストケースに従います。
出力
各テストケースの場合は、次の行に合計モジュール十億七を印刷する必要があります。
サンプル入力
3
4
0
サンプル出力
0
2
题意分析:
整数nに、及びn未満需要以上であり、nが素数ではない、そして
次に、オイラー関数、Φ(n)の値がn未満とを有する素数Nカウント数(テキストの終わり)、GCDのGCD(N、I)= 1、次いでGCD(N、Ni)の場合、性質を考えます= 1、我々はすなわち、値が偶数オイラー関数(Φが、(1)= 1)、各対であり、nにあり、クロスNペアの質と数を見ることができます。
このような問題解決のアイデアは、1-Nおよび減算N *φ(N)/ 2で出てきた答えです
書式#include <iostreamの> 書式#include <stdio.hに> する#include <アルゴリズム> 書式#include < 文字列の.h> の#include <ベクトル> 書式#include <math.h>の 書式#include <マップ> 書式#include <キュー> 書式#include < セット > 使用して 名前空間はstdを、 typedefの長い 長いLL。 const int型 MAXN = 1E5; const int型 MOD = 1E9 + 7 。 LL [MAXN]。 // O(SQRT(n))を求欧拉函数的值 INTファイ(INTN){ int型、M =(INT)SQRT(N + 0.5 )。 INT ANS = N。 以下のために(INT iが= 2 ; I <= M; I ++ ){ 場合(N%I == 0 ){ ANS = ANS / i *が(I- 1 )。 一方、(N%I == 0)N / = I。 } } もし、(N> 1)ANS = ANS / N *(N- 1 )。 戻り値は、ANS; } int型のmain() { LL N。 しばらく(scanf関数(" %のLLD "、&n)を=! -1 && N) { LL ANS =(N *(N- 1)/ 2)%MOD。 ANS - =(N *ファイ(N)/ 2)%MOD。 COUT <<(ANS + MOD)%のMOD << ENDL。 } // のprintf( "%のLLD \ n"は、ANS)。 リターン 0 ; }
オイラー関数φは:特に、式1からφの定義(1)= 1は、n-1及びnに下記、素数の数を指し
ここでpiは、nの素因数です。
小さな日常の学習アルゴリズム:私のオリジナルのマイクロチャネルパブリック数を見る
、より多くのオリジナルの記事を参照してください。一緒に学び、進歩するために!