アルゴリズムの説明
(この記事は、メビウスの逆転を学んだことを前提としています(〃 '▽'〃)
メビウス関数には次のプロパティがあることがわかります:\(\ sum \ limits_ {d | n} \ mu(d)= [n = 1] \)
この特性に従って、ふるいのようなもの、つまり最初は\(0 \)である配列を記述します。最初の\(I \)ホイール、\(I \)の倍数であるプラス\(\ MU(I)\) 。
\(N- \)ホイールの後、明らかにのみ第一の位置は左\(1 \)を、他のものになっている(0 \)\。この表を理解し、下を見下ろしてください。
したがって、ここで\(n = 1 \)のときに答えを求めると仮定しますが、簡単に見つけることができるのは\(n \)の倍数の答えの合計、つまりピンチを変換する方法(⊙.⊙)だけです。
私たちは、セット(\ f(x)が)\表し\(N \)を正確に\(X \)答え、\(F(X-)が\)を表す(\ n)を\に\(X \)複数回答そして、それは\(\ sum \ limits_ {d | n} f(n)\)です。
考虑\(\ sum \ limits_ {i = 1} ^ {n} \ mu(i)F(i)\)、
それ\(= \ sum \ limits_ {i = 1} ^ {n} \ sum \ limits_ {i | j} \ mu(i)f(j)\)
各\(f(i)\)が何回カウントされるかを考えてみましょう。
\(\ sum \ limits_ {j = 1} ^ {n} f(j)\ sum \ limits_ {i | j} \ mu(i)= \ sum \ limits_ {j = 1} ^ {n} f(j )[j = 1] = f(1)\)
\(f(1)\)私たちが要求したものではありません、\(n \)はたまたま\(1 \)の計画です(✪ω✪)
したがって、問題を解決するためのメビウスの断固たるステップ:
- \(n = 1 \)プログラムに変換します(通常、このステップでの考え方を比較します)
- \(n \)の倍数のスキームを見つけ、
これは少し抽象的だと言ってください、またはいくつかの質問をしてください☆めまい
離陸〜
T1。CF 439E
与えられた\(Q \)クエリ、与えられた各\(N-、K \)は、どのように多くの方法を尋ねた\(N- \)に\(K \)番号が追加され、すべての数の\ (\ gcd \) is \(1 \)(ie:part of \(\ gcd \)is not allowed to \(1 \)、for when \(n = 20、k = 3 \)、\(\ { 2,3,15 \} \)は合法的な分割のセットです)
\(q、n \ le 10 ^ 5、k \ le n \)
解決策
上記の「\(n = 1 \)プラン番号」に変換する方法
セットが\(F(I)\)を表し:\(K \)数\(\ GCD = I \)番号スキーム、\(F(I)\)を表し:\(K \)番号\ (\ gcd \)は、\(i \)の倍数であるスキームの数です(つまり、\(k \)がすべて\(i \)の倍数であるスキームの数)。
\(F(i)\)は良いです。明らかに、この時間\(I \)がある(N- \)\因子(\(K \)の数である\(I \) 、倍数、彼らは追加\(N- \)である(\ I \ )))。そうでない場合、\(F(i)= 0 \)
次に、すべての数は\(i \)の倍数の除算スキームであり、\(i \)数を1つのブロックにマージできます。次に、\(n / i \)ブロックがあり、\(k \)に分割できます。各部分について、解の数を見つけます。我々は、次に\(N / I \)は中間ブロックを挿入(N / I-1 \ \ ) バッフル、選択\(K-1 \)一つ置くことができる\(N- \)に番号(\ k \)パーツ。各パーツは\(i \)の倍数です。このように、スキームの数は\(F(i)= C_ {n / i-1} ^ {k-1} \)です。前処理階乗および階乗逆、この\(O(1)\)計算。
次に、メビウスの除外式によれば、\(f(1)= \ sum \ limits_ {i = 1} ^ {n} F(i)\)です。次に、この質問では、タイプを変更する必要があります(上記を参照)。\(i | n \)、\(F(i)\)は、上記の方法に従って計算できます。それ以外の場合は、\(F(i)= 0 \)です。。したがって、\(f(1)= \ sum \ limits_ {i | n} F(i)\)
次に、この列挙係数は\(O(\ sqrt {n})\)です。全体の複雑さ\(O(q \ sqrt {n})\)は合格します。
コード(スペースの問題のため、ホームページを掲載したくありません(* ▽ *))(コードが理解できない右下隅に連絡するか、コードのコメント領域にコメントを残してください~~❤)
T2。CF 900D
それは分裂の問題でもあります。\(T1 \)と同等:
- \(k \)制限を削除する
- 問い合わせのグループ。スコープは\(n \ le 10 ^ 9 \)に変更され、回答モードは\(10 ^ 9 + 7 \)です。
- パラメータ\(y \)を指定して、すべての数値を割ります\(\ gcd = y \)(\(1 \)に等しいのではなく)
解決策
すべての数字(\ \ GCD = Y \)で割った全てに対応する、\(Y \)の後に\(\ = GCD 1 \) 。
その場合、\(k \)制限はありません。これは、ランダムに選択/選択解除されたすべてのパーティションに相当します。これ⊙(・◇・)どう?
仮定\(N- \)バッフルを、答えは(^ {N-2} \)\。その場合、\(n \)の数は制限されず、各数は\(y \)の倍数であり、解の数は\(2 ^ {n / y-1} \)です。
次に、\(n \ le 10 ^ 9 \)の場合、\(\ mu \)の一部のみを除外でき、範囲を超える場合は、暴力的である必要があることに注意してください。
この時間の複雑さは少し形而上学的です...しかし、それでもまずまずですφ(>ω<*)
T3 CF1036F
\(T \)グループクエリ、毎回\([2、n] \)に適切な数値がいくつあるか。数値\(x \)は「適切な数値」であり、\(\ sqrt [k] {x} \)が整数であるような\(k \)はありません。
\(T \ le 10 ^ 5、x \ le 10 ^ {18} \)。
解決策
数は「良い数」であり、素因数を分解した後、すべての指数\(\ gcd = 1 \)
次に、すべての指数の\(\ gcd \)がどのように\(k \)の倍数であるかを考えます。明らかに、このスキームの数は\(\ lfloor \ sqrt [k] {x} \ rfloor \)です。
次に、\(k \)はおそらく\(60,70 \)に列挙されれば十分です。
そして、カード億の少し O(╥﹏╥)Oにより一定のパス
おわりに
私の上のでたらめを注意深く読んで理解すれば...
おめでとうございます!メビウス反転を学んだ!φ(>ω<*)
花の終わり~~~