ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

AT3965 题解

2020-11-19 13:03:03  阅读:292  来源: 互联网

标签:AT3965 蓝色 题解 mo lon 红色 mul rep


\(\Large\natural\) AT3965 [AGC025B] RGB Coloring / 原题链接


思路

首先,明显地,我们可以把绿色看成同时涂上红色和蓝色。这样得分仍为 \(A+B\)。

所以红色和蓝色就独立了,即它们互不影响(转化前是一个格子涂了红色就不能再涂蓝色,不是独立的)。

所以我们依次枚举红色的个数 \(i\),这样蓝色的个数就是 \(j=\frac{(K-A\times i)}{B}\)。

然后用排列组合公式来枚举会有多少种方案。即 \(C^i_n*C^j_n\)。

因为时间不紧,我用了快速幂求逆元。

代码

#include<bits/stdc++.h>
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define lon long long
using namespace std;
lon mo=998244353;
lon n,a,b,ned,ans,mul[312345];

lon power(lon p,lon q){
	lon tot=1;
	while(q){
		if(q&1)tot=(tot*p)%mo;
		p=(p*p)%mo;
		q=q>>1;
	}
	return tot;
}

lon inv(lon z){return power(z%mo,mo-2);}

lon Cnm(lon Cn,lon Cm){
	if(Cn<0 || Cn>n || Cm-Cn<0)return 0;
	lon upp=(mul[Cm]*inv(mul[Cm-Cn]))%mo,low=mul[Cn];
	return (upp*inv(low))%mo;
}

int main(){
	cin>>n>>a>>b>>ned;
	mul[0]=1;
	rep(i,1,n)mul[i]=(mul[i-1]*i)%mo;
	rep(i,0,n){
		if(ned-i*a<0)break;
		if((ned-i*a)%b==0)ans=(ans+Cnm(i,n)*Cnm( (ned-i*a)/b ,n)%mo)%mo;
	}
	cout<<ans;
}

标签:AT3965,蓝色,题解,mo,lon,红色,mul,rep
来源: https://www.cnblogs.com/BlankAo/p/14004958.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有