题目链接:https://vjudge.net/problem/HYSBZ-1008
题目大意:n个监狱关押着n个犯人,有m种宗教信仰,若相邻两个监狱的犯人有着相同的宗教信仰,那么他们就可能越狱,求有多少种状态会发生越狱?
题目思想:逆向思维,求出相邻俩人不信同一个教的状态数,用总状态数减去即可。
/*
第一个人有m中选择,第二个人不能跟第一个人一样,m-1种选择,第三个不能跟第二个一样....
所以一共有m*(m-1)^(n-1)种可能是无法越狱的,
m^n(每个犯人都有m种可能信的教,一共n个犯人,
得出公式m^n-m*(m-1)^(n-1),
用快速二次幂...
*/
顺便复习了一下快速二次幂模板:
//快速幂的模板( 求a ^ b % mod ):
ll quick_mod( ll a, ll b ){
ll ans = 1 ; a %= mod;
while ( b ) {
if ( b & 1 )
{ans = ans * a % mod; b--;}
b >>= 1; a = a * a % mod;
}
return ans;
}
AC代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<sstream>
#include<stack>
#include<map>
#define INF 0x3f3f3f
#define mod 100003
using namespace std;
const int maxn=1000000+10;
typedef long long ll;
using namespace std;
//快速幂的模板( 求a ^ b % mod ):
ll quick_mod( ll a, ll b ){
ll ans = 1 ; a %= mod;
while ( b ) {
if ( b & 1 )
{ans = ans * a % mod; b--;}
b >>= 1; a = a * a % mod;
}
return ans;
}
int main(){
ll m,n;
cin>>m>>n;
ll tol=quick_mod(m,n);
ll no=(m%mod*quick_mod(m-1,n-1))%mod;
ll sum=(tol-no)%mod;
if(sum<0)sum+=mod;
cout<<sum<<endl;
return 0;
}
特别要注意的是:两个数想减后可能会小于零,一定要再加上mod,不然会导致WA。