题目链接:点击打开链接
题目大意:n个犯人m种宗教,相邻俩犯人同种宗教就一起跑路,问有几种安排方式会发生跑路。
题目思路:你直接正着想确实巨难...........这个时候就可以逆向思维了,发生跑路的情况难算,但是不跑路的情况简单啊,只要相邻俩人不信同一个教就好了嘛...第一个人有m中选择,第二个人不能跟第一个人一样,m-1种选择,第三个不能跟第二个一样....恩,所以一共有m*(m-1)^(n-1)种可能是不跑路的,总情况就很简单了,m^n嘛(每个犯人都有m种可能信的教,一共n个犯人,组合数学中的排列)然后得出公式m^n-m*(m-1)^(n-1),不过记得要用二分快速幂...
以下是代码:
#include<iostream>
#include<cstdio>
using namespace std;
#define MOD 100003
long long pow1(long long x,long long y){
if(y==0){
return 1;
}
long long temp=pow1(x,y/2);
temp*=temp;
temp%=MOD;
if(y&1){
temp*=x;
temp%=MOD;
}
return temp;
}
int main(){
long long n,m,zong,rest,ans;
while(~scanf("%lld%lld",&m,&n)){
rest=pow1(m-1,n-1);
zong=pow1(m,n);
rest*=m;
rest%=MOD;
ans=zong-rest;
if(ans<0){
ans+=MOD;
}
printf("%lld\n",ans);
}
return 0;
}