【BZOJ1008】【HNOI2008】越狱
以前水过的水题
原题:
监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果
相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱
1<=M<=10^8,1<=N<=10^12
稍用点组合数学的知识即可推出答案,不过我没看出来
用减法原理,有相邻一样的个数是所有个数m^n-没相邻一样的个数
第一个数有m种可能,第二个数要和它不一样就有m-1种可能,第三个数要和第二个数不一样又有m-1种可能,没相邻一样的个数就是m*((m-1)^(n-1))
听说所有的数都要longlong(我看题解了一。一)
需要注意的是不能直接输出答案,要判断如果答案小于零,就要加上取的余数
代码:
1 #include<iostream> 2 #include<cstdio> 3 using namespace std; 4 long long num=100003; 5 long long n,m; 6 long long fast_mi(long long x,long long y) 7 { 8 long long z=1,base=x; 9 while(y) 10 { 11 if(y%2) 12 { 13 z=(z*base)%num; 14 } 15 base=(base*base)%num; 16 y>>=1; 17 } 18 return z; 19 } 20 int main() 21 { 22 cin>>m>>n; 23 long long ans=(fast_mi(m,n)-(m*fast_mi(m-1,n-1))%num)%num; 24 while(ans<0) 25 { 26 ans+=num; 27 } 28 cout<<ans<<endl; 29 return 0; 30 }