洛谷 P3197 [HNOI2008]越獄 解題報告
阿新 • • 發佈:2018-07-07
hnoi tdi -h 快速冪 我們 noi2008 () 復雜 turn
,即第一個房間有\(M\)種選擇,其余房間因為要保證和前一個房間不同,所以只有\(M-1\)種選擇
P3197 [HNOI2008]越獄
題目描述
監獄有連續編號為\(1…N\)的\(N\)個房間,每個房間關押一個犯人,有\(M\)種宗教,每個犯人可能信仰其中一種。如果相鄰房間的犯人的宗教相同,就可能發生越獄,求有多少種狀態可能發生越獄。
輸入輸出格式
輸入格式:
輸入兩個整數 \(M,N\)
輸出格式:
可能越獄的狀態數,模100003取余
說明
\(1≤M≤10^8\)
\(1≤N≤10^{12}\)
我們發現,直接求發生越獄的狀態不是不可能,但時間復雜度過不去,很難用矩陣乘法優化。
不妨反其道而行之,采用補集轉換的思想
我們先求出所有可能的宗教分布,為\(M^N\)
然後減去所有不可能發生越獄的情況,為\(M*(M-1)^{N-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]越獄 解題報告