快速幂——越狱

问题 D: 越狱

时间限制: 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<

 

你可能感兴趣的:(快速幂)