ポリア定理エントリ[バーンサイド補題、ポリA定理、オイラー関数]

このブログは$ポリア、より詳細な証拠のアプリケーションに焦点を当てて、Baiduのしてください。$
___

$バーンサイド補題の$

$$ L = \ FRAC {1} {| G |} \ sum_ {i = 1} ^ {| G |} D(a_iを)$$

$ L $:本質的に異なるソリューションの数。
$ G $:代替クラスタセット。
$ $ a_iを:置換の置換基$ Iドル。
$ D(a_iを)$:$ a_iを$置換を行う、状態がありませんプログラム変更の数。

コンテンツとそれほどではない以下の補題が、あなたは無視することができます。
___
$問題の$の リンクを
別のスキームが自然を請うどのように多く、$ M $染めの色を使用して、$ N $ストーンサークルがあります。

$ポリアの定理に問題を取ります$ $ $↓


$ポリア定理$

$$ L = \ FRAC {1} {| G |} \ sum_ {i = 1} ^ {| G |} M ^ {C(g_i)} $$

最初の式を投げました。

この問題は、である置換基の$ Gの$:$ 0 $二次転写、二次転写$ 1 $ ... $ N-1 $トランスフェクトされた時間(時計回りの両方)。
回転は、$ K $位置を満たし、そして元の状態$に等しい位置(i + K)%のN個の同一の、その後$ I $色 $の位置の色、
回転$さt $時間は、依然として同じ位置を感じるすなわち、$ I $位置$(Iは+ T K)%のNの$位置同じ色、
回転$ I $ $ T $ A $のk $時間は、すなわち、無制限の回転原位置に復帰することができるであろう
(T I +全$ I $ $になるように
閉位置に提示%N $ K) $の\色{赤} {} $セクションサイクル。
設定時間$さt $ターン後、最初のバック$ I $位置、
のT * K = LCM(K、 N)$ = \ FRAC {K * GCD {} N(K、N)} $、
$ \従ってT = \ FRAC GCD {{N}(K、N)} $、

$ $ \ FRAC {N}、{T} = GCD(K、N)$の量で$ T $ $ \の色{赤} {} $ループ部の長さは、$ \色{赤} {}円形断面。

式$ Mが$への色の数、$ $ G_iでは、$ C(g_i)の$ \色{赤} {} $円形断面を$で置き換えます。

この質問の$ C(g_i)= GCD(中 K、N)$、$$ \従って回答= L = \ FRAC {1} {N} \ sum_ {k = 0} ^ {N-1} M ^ {GCD (K、N)} $$
___

$ $ 1拡大

問題は、$ \色{赤} {} $同型対称性を増加させる場合、その元の2つの異なる方式を意味対称、プログラムとして時計を
$ N $パリティ分類議論によって:

  1. $ $ Nノットのサイクル数$ \ FRAC {N + 1}、対称の軸の点があり、奇数である {2} $、 $ N $総順列対称軸、回答寄与の$の\ FRAC { N M ^ {\ FRACの+。1 {N}は{2}}}} $ {2N
    最終回答が$$回答= L = \ FRAC {ある 1}、{2N}(\ sum_ {k = 0} ^ {N- } ^ {M GCD。1(K、N)} N +
    M ^ {\ FRAC。1} + {N} {2})$$
  2. $ $ Nは偶数であり、いかなる点対称軸が存在しないことがあり、2点があり、両方の対称の$ \のFRAC {N} {2の軸に有していてもよい } $ 、タイプ$ N $置換の合計が軸対称
    の対称軸、ループ部の数は$ \ FRAC {N} {2上にない点は、いつ } $、 回答寄与の$ \のFRAC {M ^ {\ FRAC {N} {2}}}、{2N} $は、 合計に寄与しません$ \ FRAC {\ FRAC {N} {2} M {^ \ FRAC {{N} {2}}}} $ 2N。
    対称のときにビット軸、ノットの周期$ \ FRAC {N}の数{2 } 1 + $、回答寄与の$ \のFRAC {M ^ {\ FRAC {N} {2} +1}}、{2N} $、 $ \ FRAC {\ FRAC {N} {2}の合計寄与
    M {^ \ FRAC {N} {2} +1}}、{2N} $。

    所以最后的答案为
    $$Ans=L=\frac{1}{2N}(\sum_{k=0}^{N-1}M^{gcd(k,N)}+\frac{N}{2}M^{\frac{N}{2}}+\frac{N}{2}M^{\frac{N}{2}+1})$$
    ___

$拓展2$

若 $\color{red}{N<=10^9}$ , $O(N)$计算下式会 $TLE$, 需要更快的办法,
$$Ans=L=\frac{1}{N}\sum_{k=0}^{N-1}M^{gcd(k,N)}$$

由于 $gcd(k,N)|N$, 而$N$的约数不会超过 $2\sqrt{N}$ 个,
考虑枚举 $d$, $(d|N)$
则就只需统计 $gcd(k,N)=d$ 的 $k$ 的个数.
$d=gcd(k,N)=gcd(dt, d\frac{N}{d})$
则 $t$ 与 $\frac{N}{d}$ 互质, 即 $\color{red}{gcd(t, \frac{N}{d}) = 1}$.
$\therefore \color{red}{\varphi(\frac{N}{d})}$ 即为 $gcd(k,N)=d$ 的 $k$ 的个数.

于是 $$Ans=L=\frac{1}{N}\sum_{d|N}\varphi(\frac{N}{d}) *M^d$$
.

$如何求解 \varphi(x)?$
根据定义: $$\varphi(x)=x\prod_{p_i|x}(1-\frac{1}{p_i})$$
通分得: $\varphi(x) = x\prod_{p_i|x}\frac{p_i-1}{p_i}$
按上式实现, 时间复杂度小于 $O(\sqrt{N})$, 均摊 $O(logN)?$
这里给出求解函数,

int Get_phi(int x){
    int s = x;
    for(int i = 2; i*i <= x; i ++)
        if(x % i == 0){ //找到一个质因数
            s = s/i*(i-1);
            while(x%i == 0) x /= i;
        }
    if(x > 1) s = s/x*(x-1);    //不可能出现两个大于 sqrt(N) 的质因数, 所以只可能剩下一个, 处理掉就好 .
    return s;
}

所以 $O(\sqrt{N}),O(logN)$ 分别求出所有约数 $d$ 和 $\varphi(\frac{N}{d})$ 即可, 时间复杂度 $O(\sqrt{N}logN)$.
___
$\mathcal{Code}$

#include<bits/stdc++.h>
#define reg register

const int mod = 1e9 + 7;

int T;
int N;

int phi(int x){
        int s = x;
        for(reg int i = 2; i*i <= x; i ++)
                if(x % i == 0){
                        s = s/i * (i-1);
                        while(x % i == 0) x /= i;
                }
        if(x > 1) s = s/x * (x-1);
        return s;
}

int KSM(int a, int b){
        int s = 1; a %= mod;
        while(b){
                if(b & 1) s = 1ll*s*a % mod;
                a = 1ll*a*a % mod, b >>= 1;
        }
        return s;
}

void Work(){
        scanf("%d", &N);
        int Ans = 0;
        int lim = sqrt(N);
        for(reg int d = 1; d <= lim; d ++){
                if(N % d) continue ;
                Ans = ( 1ll*Ans + (1ll*phi(N/d) * KSM(N, d) % mod) ) % mod;
                int d_2 = N / d;
                if(d_2 == d) continue ;
                Ans = ( 1ll*Ans + (1ll*phi(N/d_2) * KSM(N, d_2) % mod) ) % mod;
        }
        printf("%d\n", (1ll*Ans*KSM(N, mod-2)) % mod);
}

int main(){
        scanf("%d", &T);
        while(T --) Work();
        return 0;
}

$例题$

更多例题请戳 这里 .


おすすめ

転載: www.cnblogs.com/zbr162/p/11404147.html