Codeforce Round #439 A B C 题解

A The Artful Expedient

题意:给出各不相同的N个数 X1~XN Y1~YN 

Xi^Yj=Yk或Xi^Yj=Xk 那么pair数+1 ,如果最后pair数为偶,输出Karen 否则输出Ben 

思路:异或满足交换律,对于所有Xi^Yj=Yk 均有Xi^Yk=Yj 

对于Yk,Yj是Xi^Yj=Yk 的唯一解,因为互不相同

Xi Yi均不为0,不存在Xi^0=Xi的情况

所以所有pair数只能为偶数w

(听说乱搞会超时)


. The Eternal Immortality:

题意:求a!/b!的最后一位是啥

思路:(a-b)>=10 的情况为0,(a==b)输出1,否则取模10,尾数直接模拟阶乘,

98 103这种数据还要注意一下不是1..加了flag就A了,总感觉不对

(正解:其实a-b>=5就可以输出0了!!其余还是取模10乘)


C.The Intriguing Obsession

题意:三个颜色的群岛数目分别为a,b,c,小岛连线距离均为1,可连可不连

但同颜色小岛之间不能距离为1或2 ,问有多少种连线方式

思路1:仅考虑a,b俩群岛,等价于(a<b)a个不同的小球放入b个不同的盒子

每个盒子至多一个的方案数,球可以放k:0~a个

假设只放k个

情况是C(a,k)*b!/(b-k)!  (第一个球可以放b种)(第二个球只有b-1种可以放)

  现在k可以取0~a 那么ans=sigma(k:1~a,  C(a,k)*b!/(b-k)!)

预处理5000以内阶乘取模,逆元直接求即可,

ab bc ac是独立的,分别求一遍

31ms 100kb


思路2:dp(i,j)=j*dp(i-1,j-1)(取第i个球)+dp(i-1,j)(不取第i个球)

dp(i,0)=dp(0,i)=1

开dp(5000,5000)刚好不爆内存


其实思路1,2式子等价= =然而并不会解二维递推


D题Q神出题,完全不会的说QAQ


AC code:

A:略

B:略

C:

const int N=5005;
const int mod=998244353;
ll fac[N];
ll inv2(ll t)  //求t关于p的逆元,注意:t要小于p,最好传参前先把t%p一下
{
	return t == 1 ? 1 : (mod - mod / t) * inv2(mod % t) % mod;
}
void initfac()
{
	fac[0]=1;
	for(int i=1; i<=N; i++)
	{
		fac[i]=1ll*fac[i-1]*i%mod;
		fac[i]%=mod;
	}
}
ll solve(ll a,ll b)
{
	if(a>b)
	{
		swap(a,b);
	}
	ll ans=0;
	for(int i=0; i<=a; i++)
	{
		ans=ans+(fac[a]%mod*fac[b]%mod*inv2(fac[i])%mod*inv2(fac[a-i])%mod*inv2(fac[b-i])%mod)%mod;
		//ans%=mod;
	}
	ans%=mod;//没了这句会WA 
	return ans;
}
int main()
{
	initfac();
	ll a,b,c;
	cin>>a>>b>>c;
	ll ans=1;
	ans=ans*solve(a,b)%mod;
	ans=ans*solve(c,b)%mod;
	ans=ans*solve(a,c)%mod;
	cout<<(ans+mod)%mod;
	return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值