Beer Barrels(逆元,快速幂)

在这里插入图片描述在这里插入图片描述t在这里插入图片描述题意:给出四个整数:A,B,K,C,A,B,C 都是大于 0 的一位数,问在所有仅由 A 或 B 组成的 K 位数中(K 位数的每一位都是 A 或 B),数字 C 的个数有多少。
题解:当A!=C&&B!=C时,直接输出0;当A=B=C时,输出K;
一般情况:在这里插入图片描述代码:

#include<iostream>
typedef long long ll;
const ll mod=1e9+7;
using namespace std;
int A,B,K,C;
ll qpower(ll a,ll b)
{
	ll ans=1;
	while(b)
	{
		if(b&1)
		ans=(ans*a)%mod;
		a=(a*a)%mod;
		b>>=1;
	}
	return ans%mod;
}
ll f(ll x,ll y)
{
	ll ans=1;
	while(y)
	{
		ans=(ans*x)%mod;
		x--;
		y--;
	}
	return ans%mod;
}
int main( )
{
	ll sum=0,cnt=0;
	cin>>A>>B>>K>>C;
	if(C!=A&&C!=B)
	{
		cout<<0<<endl;
		return 0;
	}
	else if(A==B)
	{
		cout<<K<<endl;
		return 0;
	}
	else 
	{
		for(int i=1;i<=K;i++)
		{
			ll ans=f(K,i);
			ll ans2=f(i,i);
			sum=(i%mod*ans%mod*qpower(ans2,mod-2)%mod)%mod;
			cnt=(cnt+sum)%mod;
		}
		cout<<cnt<<endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值