HYSBZ - 1008

题目链接: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。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值