排列组合习题

排列组合简单试题

题目来源:P3197 [HNOI2008] 越狱
在这里插入图片描述
解题思路:
既然有相同信仰的罪犯会越狱,不妨把n个房间想象为n-1个房间,其中一个房间有两个相同信仰,来大概分一下情况:4房间,2信仰,有如下情况
(11)11 / (11)12 / (11)21 / (11)22 / (22)11 / (22)12 / (22)21 / (22)22 / 8种
2(11)1 / 2(11)2 / 1(22)1 / 1(22)2 / 4种
12(11) / 21(22) / 2种
设有两个特殊信仰的房间位置为x
x之前的每个房间有m-1个选项,x之后的每个房间有m个选项
得到公式
ans=m^(n-1) + (m-1) * m ^(n-2) + (m-1) ^ 2 * m ^ (n-3) +…
不难看出是一个等比数列
合并后ans=m^n-m*(m-1) ^ (n-1)
附上ac代码

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
ll const mod=100003;
ll fast_pow(ll a,ll b){
	ll res=1;
	while(b){
		if(b&1) res=(res*a)%mod;
		a=(a*a)%mod;
		b>>=1;
	}
	return res;
}
int main(void){
	ll n,m;cin>>m>>n;
	ll ans=0;
	ans=(ans+fast_pow(m,n))%mod;
	ans=(ans-(m%mod)*(fast_pow(m-1,n-1)%mod));
	while(ans<0) ans+=mod;
	ans%=mod;
	cout<<ans;
	
	return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值