题目描述
原题来自:HNOI 2008
监狱有连续编号为 11 到 nn 的 nn 个房间,每个房间关押一个犯人。有 mm 种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人信仰的宗教相同,就可能发生越狱。求有多少种状态可能发生越狱。
输入格式
输入两个整数 mm 和 nn。
输出格式
可能越狱的状态数,对 100003100003 取余。
样例
Input | Output |
---|---|
2 3 | 6 |
所有可能的 66 种状态为:{0,0,0},{0,0,1},{0,1,1},{1,0,0},{1,1,0},{1,1,1}{0,0,0},{0,0,1},{0,1,1},{1,0,0},{1,1,0},{1,1,1}。
数据范围与提示
对于全部数据,1\le m\le 10^8,1\le n\le 10^{12}1≤m≤108,1≤n≤1012。
#include<bits/stdc++.h>
using namespace std;
//m宗教 n人数
int mod=100003;
long long mi(long long m,long long n)//幂运算
{
long long num=1;
while(n)
{
if(n&1)
num=num*m%mod;
m=m*m%mod;
n >>=1;
}
return num;
}
int main()
{
long long n,m;
cin >>m >>n;
long long num1,num2;
num1=mi(m,n);
num2=m*mi(m-1,n-1);
//m^n-m*(m-1)^(n-1)
cout << (mod+num1%mod-num2%mod)%mod <<endl;//加h防止出现取模后s1<s2出现负数
return 0;
}