【2019HDU第一の補正マルチ] [HDU 6584] [G.流星]

トピックへのリンク: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 = { 11 }。
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 = { 11 }、ミッド。
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 }
コードの表示

 

おすすめ

転載: www.cnblogs.com/DeaphetS/p/11229431.html