题目描述
监狱有连续编号为 1…N1…N1…N 的 NNN 个房间,每个房间关押一个犯人,有 MMM 种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱。
输入输出格式
输入格式:输入两个整数 $M,N$
可能越狱的状态数,模 100003100003100003 取余
输入输出样例
输入样例#1:
2 3
输出样例#1:
6
说明
6种状态为(000)(001)(011)(100)(110)(111)
1≤M≤1081 \le M \le 10^81≤M≤108
1≤N≤10121 \le N \le 10^{12}1≤N≤1012
Solution
这道题运用了正难反易的思想.
直接处理出合法的情况即可.
然后想一想: 第一个有 n 种情况,然后的话 第二个就有 n-1 种情况.
再依次类推,会发现,后面都是 n-1 种情况.
所以 ans 即为:
m^n-(m-1)^(n-1).
套一个快速幂模板即可. 需要注意的是 ans 为负数的情况.
代码
// luogu-judger-enable-o2 #include<iostream> #include<cstdio> using namespace std; long long n,m,p; long long quick_pow(long long s,long long ks) { if(ks==1)return s%p; long long k=s; ks--; while(ks>0) { if(ks%2==1)k=(k*s)%p; ks/=2; s=(s*s)%p; } return k%p; } int main() { cin>>n>>m; p=100003; cout<<(quick_pow(n,m)%p-n*quick_pow(n-1,m-1)%p+p)%p; //需要处理负数的时候,加上一个 p再 模一个 p 即可 }