P3197 [HNOI2008]越狱(快速幂)
题目描述
监狱有连续编号为 1…N1…N1…N 的 NNN 个房间,每个房间关押一个犯人,有 MMM 种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱。
输入输出格式
输入格式:输入两个整数 M,NM,NM,N
输出格式:可能越狱的状态数,模 100003100003100003 取余
输入输出样例
说明
6种状态为(000)(001)(011)(100)(110)(111)
1≤M≤ 10^8
1≤N≤10^12
思路:
思考总数 - 合法的状态数(即邻房间的犯人的宗教不相同);
因为每个牢房的犯人都可以信仰 m 种 宗教,所以说一共有 mnmn 种组合。
当一个牢房的犯人信仰一种宗教后,相邻的牢房的犯人只可以信仰 剩下的 m-1种 中的一种才不会越狱,即:
所以说 这是 m∗(m−1)n−1m∗(m−1)n−1 种;
所以说答案就是 mn−m∗(m−1)n−1mn−m∗(m−1)n−1
因为我们在过程中mod过,减出来可能为负,我们需要 (ans + mod)%mod
1 #include"bits/stdc++.h" 2 using namespace std; 3 typedef long long ll; 4 5 ll n,m; 6 const ll mod = 100003; 7 8 ll powmod(ll a,ll b) 9 { 10 ll base = a%mod; 11 ll ans = 1; 12 13 while (b) 14 { 15 if (b&1) ans=ans*base%mod; 16 // cout<<b<<" "<<base<<endl; 17 b>>=1; 18 base=base*base%mod; 19 20 21 22 } 23 24 return ans; 25 } 26 27 28 29 30 31 int main() 32 { 33 //cout<<powmod(2,4); 34 35 cin>>m>>n; 36 37 cout<<(powmod(m,n) -( m*powmod(m-1,n-1))%mod+mod)%100003; 38 39 }