アプリケーションオイラー機能(HDU 3501)

オリジナルタイトルリンク 

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の素因数です。

小さな日常の学習アルゴリズム:私のオリジナルのマイクロチャネルパブリック数を見る
、より多くのオリジナルの記事を参照してください。一緒に学び、進歩するために!

 

 

おすすめ

転載: www.cnblogs.com/zzl-dreamfly/p/11804435.html