快速幂越狱(容斥定理)

题目描述

监狱有连续编号为1...N的N个房间,每个房间关押一个犯人,有M种宗教,每个犯人可能信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱

 

输入

输入两个整数M,N.1<=M<=10^8,1<=N<=10^12

 

输出

可能越狱的状态数,模100003取余

 

样例输入

2 3

样例输出

6

 

提示

6种状态为(000)(001)(011)(100)(110)(111)

#include <iostream>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define mod 100003
ll qpow(ll a,ll b){
    ll ans=1;
    ans=ans%mod;
    while(b){
        if(b&1) ans=ans*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return ans;
}
int main()
{
    ll m,n;
    cin>>m>>n;
    ll ans=(qpow(m,n)%mod-m*qpow(m-1,n-1)%mod+mod)%mod;
    cout<<ans<<endl;
    return 0;
}

 

posted on 2019-03-19 21:22  湫叶  阅读(165)  评论(0编辑  收藏  举报

导航