BZOJ 1008: [HNOI2008]越狱-快速幂/取模
1008: [HNOI2008]越狱
Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 8689 Solved: 3748
Description
监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果
相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱
Input
输入两个整数M,N.1<=M<=10^8,1<=N<=10^12
Output
可能越狱的状态数,模100003取余
Sample Input
2 3
Sample Output
6
HINT
6种状态为(000)(001)(011)(100)(110)(111)
这个题就是快速幂和取模:
可能越狱的状态数=总的状态数-不可能越狱的状态数。
不可能的情况就是:
第一个人m种情况,第二个人m-1种情况,第三个人m-1种情况,依次类推。
所以有如下代码:
#include<bits/stdc++.h> typedef unsigned long long ull; using namespace std; ull n=1e5+3; ull pow(ull a,ull b){ ull ans=1; while(b!=0){ if(b%2==1) ans=ans*a%n; a=a*a%n; b=b/2; } return ans; } int main(){ ull a,b; while(~scanf("%llu%llu",&a,&b)){ ull h=pow(a,b); ull k=pow(a-1,b-1); ull ans=(h+n-a*k%n)%n; printf("%llu\n",ans); } return 0; }