一开始没思路 后来看题解学会了
先考虑所有情况 每个人都有m种可能的宗教 所以总方案数为
mn
然后是考虑不能越狱的 因为这个情况好像比较好考虑 因为只要相邻两个不一样就可以 所以假如第一个人可以是m个宗教 那第2个人到第n个人一定只能有m-1种 所以这种情况的方案数就是
m∗(m−1)(n−1)
然后两边做差就可以了 需要用到快速幂 边搞边取膜
注意最后一定要有一个操作 以防减出来负数 因为都是取膜后的数 还不一定谁大谁小
代码如下
#include<iostream>
#include<cstdio>
#include<cctype>
using namespace std;
#define in = read();
typedef long long ll;
typedef unsigned int ui;
ll n , m , p = 100003;
ll ans1 , ans2 , ans;
inline ll read(){
ll num = 0 , f = 1; char ch = getchar();
while(!isdigit(ch)){
if(ch == '-') f = -1;
ch = getchar();
}
while(isdigit(ch)){
num = num*10 + ch - '0';
ch = getchar();
}
return num*f;
}
ll pow(ll a , ll b , ll p){
ll ans = 1;
while(b){
if(b & 1) ans = (ans*a)%p;
a = (a*a)%p;
b >>= 1;
}
return ans;
}
int main(){
m in; n in;
ans1 = (pow(m , n , p))%p;
ans2 = ((pow(m - 1 , n - 1 , p))*(m%p))%p;
printf("%lld" , ((ans1 - ans2) + p*200)%p);
//最后输出有一步归正操作
}
//COYG