HYSBZ 1008(快速幂+组合数学)

本文通过一个具体的编程题例介绍了如何运用逆向思维来简化复杂问题的求解过程。针对犯人与宗教信仰的问题,文章提出了一种计算不发生特定事件(如犯人因相同宗教信仰而逃跑)的排列数的方法,并给出了使用二分快速幂实现的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:点击打开链接


题目大意: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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值