题目描述
监狱有 n 个房间,每个房间关押一个犯人,有 m 种宗教,每个犯人会信仰其中一种。如果相邻房间的犯人的宗教相同,就可能发生越狱,求有多少种状态可能发生越狱。
答案对 100,003 取模。
输入格式
输入只有一行两个整数,分别代表宗教数 m 和房间数 n。
输出格式
输出一行一个整数代表答案。
输入输出样例
样例输入 #1
2 3
样例输出 #1
6
提示
样例输入输出 1 解释
| 状态编号 | 1 号房间 | 2 号房间 | 3 号房间 |
| :--------: | :--------: | :-------: | :--------: |
| 1 | 信仰 1 | 信仰 1 | 信仰 1 |
| 2 | 信仰 1 | 信仰 1 | 信仰 2 |
| 3 | 信仰 1 | 信仰 2 | 信仰 2 |
| 4 | 信仰 2 | 信仰 1 | 信仰 1 |
| 5 | 信仰 2 | 信仰 2 | 信仰 2 |
| 6 | 信仰 2 | 信仰 2 | 信仰 1 |
数据规模与约定
对于 100% 的数据,保证1≤m≤1e8,1≤n≤1e12。
知识点:快速幂、组合数学、容斥
代码
cpp
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e5+5;
const ll mod=100003;
ll temp1,temp2,ans;
ll qmi(ll a, ll k, ll p)
{
ll res=1;//res为每一步得到的结果
while(k)
{
if(k&1)
{
res=(res*a)%p;//a就是a^(2^k)
}
a=(a*a)%p;//每次平方
k>>=1;
}
return res;
}
int main()
{
ll m,n;
cin>>m>>n;
temp1=qmi(m,n,mod);
temp2=qmi(m-1,n-1,mod);
temp2=(m%mod)*temp2%mod;
ans=temp1-temp2;
if(ans<0)
{
ans+=mod;
}
ans%=mod;
cout<<ans<<endl;
return 0;
}