少数の最近のトピックを勉強し始めたが、この時間は、彼は容易に式を書き出し、
しかし、彼は、彼はこの式を計算することがありそうでなかったことがわかった、あなたは彼に結果を伝えることができ、答えは比較的大きいかもしれない、十億七に死んでください。
説明を入力します。
ライン2つの正の整数N、M行2つの正の整数N、M 行の2 番目の正の整数番号N- 、M
出力説明:
ライン出力ラインAは、整数出力の整数を表し、行目整数番号テーブルが示す出力接合結果を
注1≦nは、m≤1e61\ n型のLeq、m個の\のLeq 1E6 1つの。≤ N- タイトルの意味:二つの数字を考えると、N、M; (1〜n)を求めて(1〜 m)の最大公約数の(i、j)は広場と
アイデア:シンプルな暴力確かにタイムアウト、
我々は規則の最大の可能な数は徐々に分(N、M)から減少し始める求める回し、2つの数の最大公約数を参照してください
分(N、M)から〜1
ので、P =分(n、m)は、
その後、N N / P、すなわち除数Pの存在N / p個の複数したP
同じ目的のためにMを、
再度、P * 2からのPのすべての倍数を開始した後次いで、最大数がpの数は、約残りは、失われた、すなわち、nについて、M個の用語そのGCD(N、M)== Pの全ての組み合わせ(N / P)*(M / P)。
例
。N- = 9、M = 7;
P = 7;
GCD(I、J)== 7;
F [7] = 1;
GCD(I、J)= 6;
F [6] = 1;
GCD(I、 J)= 5;
[5] F = 5;
GCD(I、J)= 4;
F = 2 [4]。
GCD(I、J)= 3。
F [3] = 5。
GCD(I、J)= 2。
F [2] = 9。
F [1] = 44。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1つの#include <ビット/ STDC ++ H> 2 3 使用して 名前空間STDを、 4のtypedef 長い 長LL。 5 のconst int型 N = 1E6 + 10 。 6 の#define MOD十億七 7 のLL N、M。 8 のLL NUM; 9 のLL F [N]。 10 のint main()の 11 { 12 のscanf(" %のLLDの%のLLD "、&N、&M)。 13 のためには、(int型 I =分(N、M); I> = 1 ; i-- ) 14 { 15 F [I] =(N / I)*(M / I)。 16 のために(INT J = 2 * I; J <=分(N、M); J + = I) 17 { 18 F [1] - = F [J]。 19 } 20 // COUT << [I] <<」「<< I << ENDL F。 21 NUM =(NUM + F [I] * I MOD%* I%MOD)%MOD。 22 } 23 COUT << NUM << ENDL。 24 リターン 0 ; 25 }