Codeforces 643F - Bears and Juice(思维题)
首先直接暴力枚举显然是不现实的,我们不妨换个角度来处理这个问题,考虑这 \(R_i\) 个瓶子中每一瓶被哪些熊在哪一天喝过。
我们考虑对这 \(R_i\) 个瓶子各建立一个 \(q\times n\) 的 01 矩阵,第 \(j\) 行第 \(k\) 列为 \(1\) 表示第 \(k\) 只熊在第 \(j\) 天尝过了这瓶酒,反之第 \(k\) 只熊在第 \(j\) 天尝过了这瓶酒。
那么题目中的条件可表示为:
- 每一个表格里 \(1\) 的个数不能超过 \(\min(p,n-1)\),因为假设该表格里里 \(1\) 的个数超过 \(\min(p,n-1)\),那么万一这个瓶子里装的是酒,就会出现要么出现有熊没有床睡,要么所有熊都醉倒了的情况,这显然是不行的。
- 不能存在两个瓶子,喝过它的熊的集合相同,且对应熊喝的天数也相同,则一旦这些熊喝醉了,剩下的熊就无论怎样也无法知道到底哪一桶是酒,哪一桶是饮料,因此这是非法的。
考虑设集合 \(S_i=\{(x,y)|\text{第}\ x\ \text{只熊在第}\ y\ \text{天尝过了第}\ i\ \text{个瓶子}\}\),那么上述条件又可翻译为:
- 对于任意 \(i\) 都有 \(|S_i|\leq\min(p,n-1)\)
- \(\forall i,j\in[1,R_i],S_i\neq S_j\)
条件 \(2\) 显然可以用抽屉原理进一步转化为求满足 \(|S|\leq\min(p,n-1)\) 的 \(S\) 的个数,而这个数又显然可以用组合数求出,\(ans_q=\sum\limits_{i=0}^{\min(p,n-1)}\dbinom{n}{i}q^i\),到此为止我们推导出了答案的式子。
算下复杂度,\(p\) 的范围只有 \(130\),故对于每个 \(q\) 暴力计算上式的值都没问题。还有个小问题,就是这题模数为 \(2^{32}\) 不是质数,这意味着不是所有数都有逆元,故我们不能用预处理阶乘+阶乘的逆元的方式计算组合数,不过这个问题显然难不住我们,由于这题 \(p\) 范围如此小,把组合数的式子暴力展开并暴力去分母的方法都能过,复杂度 \(p^3\log p\),当然有神仙想写 exLucas 那也没人拦着你,复杂度大约可以做到 \(p\log p\),反正我是太懒不想写了(
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define fill0(a) memset(a,0,sizeof(a))
#define fill1(a) memset(a,-1,sizeof(a))
#define fillbig(a) memset(a,63,sizeof(a))
#define pb push_back
#define ppb pop_back
#define mp make_pair
template<typename T1,typename T2> void chkmin(T1 &x,T2 y){if(x>y) x=y;}
template<typename T1,typename T2> void chkmax(T1 &x,T2 y){if(x<y) x=y;}
typedef pair<int,int> pii;
typedef long long ll;
namespace fastio{
#define FILE_SIZE 1<<23
char rbuf[FILE_SIZE],*p1=rbuf,*p2=rbuf,wbuf[FILE_SIZE],*p3=wbuf;
inline char getc(){return p1==p2&&(p2=(p1=rbuf)+fread(rbuf,1,FILE_SIZE,stdin),p1==p2)?-1:*p1++;}
inline void putc(char x){(*p3++=x);}
template<typename T> void read(T &x){
x=0;char c=getchar();T neg=0;
while(!isdigit(c)) neg|=!(c^'-'),c=getchar();
while(isdigit(c)) x=(x<<3)+(x<<1)+(c^48),c=getchar();
if(neg) x=(~x)+1;
}
template<typename T> void recursive_print(T x){if(!x) return;recursive_print(x/10);putc(x%10^48);}
template<typename T> void print(T x){if(!x) putc('0');if(x<0) putc('-'),x=~x+1;recursive_print(x);}
void print_final(){fwrite(wbuf,1,p3-wbuf,stdout);}
}
typedef unsigned int u32;
const int MAXN=130;
u32 gcd(int x,int y){return (!y)?x:gcd(y,x%y);}
int n,p,q;u32 c[MAXN+5];
u32 calc(int x){
vector<u32> a,b;
for(int i=1;i<=x;i++) a.pb(n-i+1),b.pb(i);
for(int i=0;i<a.size();i++) for(int j=0;j<b.size();j++){
u32 d=gcd(a[i],b[j]);a[i]/=d;b[j]/=d;
} u32 prod=1;
for(int i=0;i<a.size();i++) prod*=a[i];
return prod;
}
int main(){
scanf("%d%d%d",&n,&p,&q);p=min(n-1,p);
for(int i=0;i<=p;i++) c[i]=calc(i);u32 ans=0;
for(int i=1;i<=q;i++){
u32 prod=1,sum=0;
for(int j=0;j<=p;j++){
sum+=prod*c[j];
prod*=i;
} ans^=i*sum;
} printf("%u\n",ans);
return 0;
}
Codeforces 643F - Bears and Juice(思维题)的更多相关文章
- C. Nice Garland Codeforces Round #535 (Div. 3) 思维题
C. Nice Garland time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...
- Codeforces 515C 题解(贪心+数论)(思维题)
题面 传送门:http://codeforces.com/problemset/problem/515/C Drazil is playing a math game with Varda. Let’ ...
- Codeforces 1188B - Count Pairs(思维题)
Codeforces 题面传送门 & 洛谷题面传送门 虽说是一个 D1B,但还是想了我足足 20min,所以还是写篇题解罢( 首先注意到这个式子里涉及两个参数,如果我们选择固定一个并动态维护另 ...
- Codeforces 1365G - Secure Password(思维题)
Codeforces 题面传送门 & 洛谷题面传送门 首先考虑一个询问 \(20\) 次的方案,考虑每一位,一遍询问求出下标的这一位上为 \(0\) 的位置上值的 bitwise or,再一遍 ...
- Codeforces 1129E - Legendary Tree(思维题)
Codeforces 题面传送门 & 洛谷题面传送门 考虑以 \(1\) 为根,记 \(siz_i\) 为 \(i\) 子树的大小,那么可以通过询问 \(S=\{2,3,\cdots,n\}, ...
- CodeForces - 427A (警察和罪犯 思维题)
Police Recruits Time Limit: 1000MS Memory Limit: 262144KB 64bit IO Format: %I64d & %I64u Sub ...
- codeforces 848B Rooter's Song 思维题
http://codeforces.com/problemset/problem/848/B 给定一个二维坐标系,点从横轴或纵轴垂直于发射的坐标轴射入(0,0)-(w,h)的矩形空间.给出点发射的坐标 ...
- Codeforces 729D Sea Battle(简单思维题)
http://codeforces.com/contest/738/problem/D https://www.cnblogs.com/flipped/p/6086615.html 原 题意:海战 ...
- E. Superhero Battle Codeforces Round #547 (Div. 3) 思维题
E. Superhero Battle time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
随机推荐
- python web1
***本篇中的测试均需要使用python3完成. 攻击以下面脚本运作的服务器. 针对脚本的代码逻辑,写出生成利用任意代码执行漏洞的恶意序列的脚本: 打开攻击机端口, 将生成的东西输入网页cookie: ...
- [no code][scrum meeting] Alpha 7
项目 内容 会议时间 2020-04-13 会议主题 OCR技术细节分析 会议时长 30min 参会人员 PM+OCR组成员 $( "#cnblogs_post_body" ).c ...
- 2020BUAA软工提问回顾和个人总结作业
2020BUAA软工提问回顾和个人总结作业 17373010 杜博玮 项目 内容 这个作业属于哪个课程 2020春季计算机学院软件工程(罗杰 任健) 这个作业的要求在哪里 提问回顾和个人总结作业 我在 ...
- 面试不再慌,终于有人把TCP讲明白了。。。
前言 TCP(Transmission Control Protocol,传输控制协议) 是计算机网络的的重要组成部分,也是网络编程的重要内容,还有我们平时接触最多的 HTTP 也是基于 TCP 实现 ...
- csp-s 2021
T1 廊桥分配 当一架飞机抵达机场时,可以停靠在航站楼旁的廊桥,也可以停靠在位于机场边缘的远机位. 乘客一般更期待停靠在廊桥,因为这样省去了坐摆渡车前往航站楼的周折. 然而,因为廊桥的数量有限,所以这 ...
- STM32串口通信配置(USART1+USART2+USART3+UART4) (转)
一.串口一的配置(初始化+中断配置+中断接收函数) 1 /*====================================================================== ...
- c++继承关系中成员函数的重载、重写、重定义之间的区别
1.Override.Overload.Redefine Overload 重载只能发生在类内部,不能发生在子类和父类的继承中.具体来说,如果子类中有父类同名.同返回值类型,但是不同参数列表,这两个在 ...
- pku 2425 A Chess Game (SG)
题意: 给一个由N个点组成的一张有向图,不存在环.点的编号是0~N-1. 然后给出M个棋子所在的位置(点的编号)[一个点上可同时有多个棋子]. 每人每次可移动M个棋子中的一个棋子一步,移动方向是有向边 ...
- 六. Go并发编程--WaitGroup
一. 序言 WaitGroup是Golang应用开发过程中经常使用的并发控制技术. WaitGroup,可理解为Wait-Goroutine-Group,即等待一组goroutine结束.比如某个go ...
- SpringBoot整合reids之JSON序列化文件夹操作
前言 最近在开发项目,用到了redis作为缓存,来提高系统访问速度和缓解系统压力,提高用户响应和访问速度,这里遇到几个问题做一下总结和整理 快速配置 SpringBoot整合redis有专门的场景启动 ...