【CF643F】Bears and Juice

传送门

  • 成都七中外地生考试加强版
  • 考虑喝过一桶酒或果汁的熊的集合,集合中的元素是一个二元组 ( x , t x ) (x,t_x) (x,tx) 表示熊的编号以及第几天和的,注意到如果一只熊和了这桶果汁没倒那么不会再喝,如果倒了那么也不会再和,那么每桶果汁或酒的集合就形如 { ( x , t x ) } \{(x,t_x)\} {(x,tx)} 其中 x x x 只出现一次,若两个集合不同则可以区分它们,床的限制是对集合大小的限制,那么容易发现答案即为
    a n s t = ∑ i = 0 min ⁡ ( n − 1 , p ) ( n i ) t i ans_t=\sum_{i=0}^{\min (n-1,p)}\binom{n}{i}t^i anst=i=0min(n1,p)(in)ti
    组合数考虑算 n i ‾ i ! \frac{n^{\underline i}}{i!} i!ni,暴力约分,复杂度 O ( p 2 log ⁡ + q p ) O(p^2\log +qp) O(p2log+qp)
#include<bits/stdc++.h>
#define cs const
#define pb push_back
using namespace std;
typedef unsigned int ui;
cs int N = 150;
ui q; int n, p, a[N], b[N]; ui c[N];
int main(){
	#ifdef FSYolanda
	freopen("1.in","r",stdin);
	#endif
	scanf("%d%d%d",&n,&p,&q);
	p = min(p,n-1); c[0]=1;
	for(int i=1; i<=p; i++) a[i] = i, b[i] = n-i+1;
	for(int i=1; i<=p; i++){
		for(int j=1; j<=i; j++){
			int t = __gcd(b[i],a[j]);
			a[j]/=t; b[i]/=t;	
		} for(int j=1; j<i; j++){
			int t = __gcd(b[j],a[i]);
			a[i]/=t; b[j]/=t;
		} c[i] = 1;
		for(int j=1; j<=i; j++) c[i] = c[i] * (ui)b[j];
	} ui ans = 0;
	for(int t=1; t<=q; t++){
		ui now = 0, mt = 1;
		for(int i=0; i<=p; i++)
		now += mt * c[i], mt *= (ui)t;
		ans ^= (ui)t * now;
	} cout << ans; return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FSYo

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值