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 ...
随机推荐
- Noip模拟42 2021.8.17
T1 卷 一看跟没有上司的舞会一样,直接敲了然后试个自己造的样例对了就跑了... 然而把它想简单了,乘积取模,还能比大小吗????? 显然不能 所以直接让对数的加和跟着$dp$直接一起跑,比大小的都用 ...
- Huffman算法
一.Huffman算法介绍 霍夫曼编码(英语:Huffman Coding),又译为哈夫曼编码.赫夫曼编码,是一种用于无损数据压缩的熵编码(权编码)算法.在计算机数据处理中,霍夫曼编码使用变长编码表对 ...
- SpringBoot整合Easyexcel操作Excel,闲暇之余,让我们学习更多
关于封面:晚饭后回自习室的路上 Easyexcel 官方文档 Easyexcel | github 前言 最近也是在写的一个小练习中,需要用到这个.趁着这次就将写个整合的Demo给大家. 希望能够让大 ...
- 穿点最多的直线 牛客网 程序员面试金典 C++
穿点最多的直线 牛客网 程序员面试金典 C++ 题目描述 在二维平面上,有一些点,请找出经过点数最多的那条线. 给定一个点集vectorp和点集的大小n,没有两个点的横坐标相等的情况,请返回一个vec ...
- 非对称加密和linux上的 ssh-keygen 工具使用
rsa :创造非对称加密的三个人名.原理是两个1024到2048之间的素数,以此为乘积.等... a*b=c 一般a*b为私钥端,c为公钥端.因为 c非常难算出a和b. ssh-keygen -t ...
- 使用Magisk+riru实现全局改机
前言 提到全局改机,我们想到修改的不是修改Android源码就是利用Xposed改机,前者成本太高,后者只能修改Java层的数据不够彻底.magisk是Android平台上功能强大的工具,利用它可以随 ...
- matlab与python scipy.signal中 freqs freqz 中w,什么时候是角频率,什么时候是真实的工程中使用的采样频率Hz,如何转化
matlab与python scipy.signal中的freqs,freqz频率分析函数,输出的w,有时候是角频率,有时候是真实频率,容易搞混,这里对比一下. 0. 精要总结: 1) freqs: ...
- 【java+selenium3】自动化cookie操作+图形验证码处理 (十五)
一.cookie操作 1.获取浏览器所有的cookie import java.util.Set; import org.openqa.selenium.Cookie; //获取浏览器所有的cooki ...
- 学习JS的第一天--初识JS
1.初识JS a.我的第一个JS程序: document.write("Hello JS")://这段代码是输出到body中就是直接打开就可以看到: console.log(&qu ...
- Linux usb 6. HC/UDC 测试
目录 1. 背景介绍 2. Device (gadget zero) 2.1 gadget zero 创建 2.2 SourceSink Function 2.3 Loopback Function ...