1. 程式人生 > >洛谷 P3197 [HNOI2008]越獄 解題報告

洛谷 P3197 [HNOI2008]越獄 解題報告

hnoi tdi -h 快速冪 我們 noi2008 () 復雜 turn

P3197 [HNOI2008]越獄

題目描述

監獄有連續編號為\(1…N\)\(N\)個房間,每個房間關押一個犯人,有\(M\)種宗教,每個犯人可能信仰其中一種。如果相鄰房間的犯人的宗教相同,就可能發生越獄,求有多少種狀態可能發生越獄。

輸入輸出格式

輸入格式:

輸入兩個整數 \(M,N\)

輸出格式:

可能越獄的狀態數,模100003取余

說明

\(1≤M≤10^8\)

\(1≤N≤10^{12}\)


我們發現,直接求發生越獄的狀態不是不可能,但時間復雜度過不去,很難用矩陣乘法優化。

不妨反其道而行之,采用補集轉換的思想

我們先求出所有可能的宗教分布,為\(M^N\)

然後減去所有不可能發生越獄的情況,為\(M*(M-1)^{N-1}\)

,即第一個房間有\(M\)種選擇,其余房間因為要保證和前一個房間不同,所以只有\(M-1\)種選擇

然後直接上快速冪即可


Code:

#include <cstdio>
#define ll long long
const ll mod=100003;
ll n,m,ans;
ll quick_pow(ll c,ll k)
{
    ll f=1;
    while(k)
    {
        if(k&1)
            f=f*c%mod;
        c=c*c%mod;
        k>>=1;
    }
    return f;
}
int main()
{
    scanf("%lld%lld",&m,&n);
    ans=((quick_pow(m,n)-quick_pow(m-1,n-1)*m%mod)%mod+mod)%mod;
    printf("%lld\n",ans);
    return 0;
}

2018.7.7

洛谷 P3197 [HNOI2008]越獄 解題報告