トピックへのリンク:http://acm.hdu.edu.cn/showproblem.php?pid=6584
タイトル効果:シークスコアは、すべての真\(0 <\ FRAC {P} {Q}の\ leq1、GCD(P、Q)= 1、P \の当量のN、Qの\当量のn個の\)、最初の\(K \であります)ごく一部
ソリューション:二分答えを考えてみましょう、と分数フォームを記録。現在のスコアは、2つの点であると仮定\(\ FRAC {P} {Q} \)、その後、スコアは以下の数に等しいです。
$$ \ sum_ {i = 1} ^ {N} \ sum_ {J = 1} ^ {\左\ lfloor \ FRAC右の\ rfloor \ {PI} {Q}} [GCD(i、j)は== 1] = \ sum_ {i = 1} ^ {N} \ sum_ {J = 1} ^ {\左\ lfloor \ FRAC {PI} {Q} \右\ rfloor} \ sum_ {D | I、D | J} ^ {}ミュー(D)= \ sum_ {i = 1} ^ {N} \ sum_ {D | I} \ ^ {}ミュー(D)\左\ lfloor \ FRAC {PI} {QD} \ \右\ rfloor = \ sum_ {D = 1} ^ {n}はミュー(D)\ \ sum_ {i = 1} ^ {\左\ lfloor \ FRAC {n}は{D} \右\ rfloor} \左\ lfloor \ FRAC { PI} {Q} \右\ rfloor $$
この式は、時間複雑さ解決方法(\)O(\ {n}はSQRTのLOGN)値プレメビウス関数であり、その後ヨーロッパ\を行うブロックに追加することができ
2つの答えを分離した後、ちょうど得点の最小値以上\(\ FRAC {P} {Q}を\)を見つけます。\(シュテルン - Brocotツリー\)を使用して問題を公式ソリューションは、実際には、分母を列挙することによって(\ O(n))は\を行うことができます解決
私のコードの実行7347ms ...とKだけでなく、リミット前に質問_(:з「∠)_
1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 の#define N 1000001 4 の#define LL長い長い 5 LL T、N、K、CNT、P [N]、μ[N]、V [N]。 6 の#undef LL 7 構造体Fracの 8 { 9 の#define LL __int128 10 LL P、Q。 11 ボイドSIMP() 12 { 13 LL D = __gcd(P、Q)。 14 P / D =、Q / = D。 15 } 16 Fracの演算子 +(CONSTフラクショナル&T)CONST 17 { 18 FracのTMP。 19 tmp.q = Q * TQ。 20 tmp.p = P * t.q + q個の*のTP。 21 tmp.simp()。 22 リターンTMP; 23 } 24 のFRAC オペレータ /(CONST LL&T)CONST 25 { 26 FracのTMP。 27 tmp.p = P。 28 tmp.q = Q * T。 29 tmp.simp()。 30 リターンTMP; 31 } 32 ブール 演算子 <(CONSTフラクショナル&T)CONST 33 { 34 リターン P *はTQ <Qの*のTP。 35 } 36 ブール 演算子 <=(CONSTフラクショナル&T)CONST 37 { 38 リターン P *はTQ <= Q * TP。 39 } 40 の#undef LL 41 }。 42 ボイドpretype() 43 { 44 の#define長い長LL 45 マイクロ1 ] = 1 。 46 のために(LL I = 2 ; iがNを<; Iは++ ) 47 { 48 であれば、P [++ CNT = I、ミュー[I] = - (V [i]が!)1 。 49 のための(LLのJ = 1 ; J <= CNT && iは* P [j]は<N; J ++ ) 50 { 51 vが[iが* P [j] = 1 。 52 であれば(私%P [j] == 0)ブレーク。 53 - MU = [Iがj] [Pを*] ; MU [I] 54 } 55 } 56 用(LL i = 1 ; iがNを<; I ++の) 57 マイクロ[I] + = MU [I- 1 ]。 58 #undefの LL 59 } 60 の#define LL __int128 61 LL F(LL、LLのB、LLのC、LL n)が 62 { 63 LLのM =(N * + B)/ C。 64 もし(!||メートル)の戻り 0 ; 65 であれば(> = C || B> = C)戻り N×(N + 1)/ 2 *(A / C)+(B / C)*(N + 1)+ F(%のC、Bの%のC 、C、N)。 66 リターン N * MF(C、CB- 1、M- 1 )。 67 } 68 LLチェック(のFRAC K) 69 { 70の LL RES = 0 。 71 のために(LL i = 1 ; iは= <N; iは++ ) 72 { 73 のLL J = N /(N / I)。 74の RES + =(MU [J] -mu [I- 1 ])* F(KP、0、KQ、N / I)。 75 I = J; 76 } 77の リターンRES。 78 } 79 LL CEIL(LL X、LL Y){ リターン(X- 1)/ Y +1 ;} 80 の#undef LL 81 空隙検索(のFRAC K) 82 { 83 の#define LL長い長い 84 FracのANS = { 1、1 }。 85 のために(LL i = 1 ; iは= <N; iは++ ) 86の ANS =分(ANS、{CEIL(KP * I、KQ)、I})。 87 ans.simp()。 88 のprintf(" %LLD /%LLD \ n " 、(LL)ans.p、(LL)ans.q)。 89 } 90 ボイドのinit() 91 { 92 のscanf(" %のLLDの%のLLD "、&N&K)。 93 のFRAC L = { 1、n}は、R = { 1、1 }、ミッド。 94 一方、(1 +(フラクショナル){ 1、N * N} <= r)は 95 { 96 半ば=(L + R)/ 2 。 97 であれば(チェック(MID)<K)L = ミッド。 98 他の R = ミッド; 99 } 100 検索(L)。 101 } 102 INT メイン() 103 { 104 // freopenは( "test.in"、 "R"、STDIN)。 105 // freopenは( "test.outに"、 "W"、STDOUT)。 106 pretype()。 107 のscanf(" %のLLD "、&T)。 108 一方(T-- )のinit(); 109 戻り 0 ; 110 }