时间限制: 1 Sec 内存限制: 128 MB
提交: 17 解决: 6
[提交][状态][讨论版][命题人:quanxing]
监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱
输入两个整数M,N.1<=M<=10^8,1<=N<=10^12
可能越狱的状态数,模100003取余
2 3
6
任意两个相邻房间的犯人的宗教不相同得到的可能有m*(m-1)^(n-1)种
一共m^n种可能减去m*(m-1)^(n-1)就是至少一对相邻房间的犯人的宗教相同的所有可能
要注意相减的时候因为之前取余过,m^n%mod不一定大于m*(m-1)^(n-1)%mod,所以出现负数时应该将被减数加上mod
#include
#include
#include
#include
#include
#include
using namespace std;
long long int n,m,a;
long long int mod=100003;
long long int quickpow(long long int x,long long int y,long long int n)
{
long long int ans=1;
while(y)
{
if(y%2==1)ans=ans*x%n;
x=x*x%n;
y/=2;
}
return ans;
}
int main()
{
cin>>m>>n;
a=quickpow(m%mod,n-1,mod)-quickpow((m-1)%mod,n-1,mod);
if(a<0)a+=mod;//考虑负数情况
cout<