CF643F-Bears and Juice【组合数学】
正题
题目链接:https://www.luogu.com.cn/problem/CF643F
题目大意
题目有点奇怪就直接放翻译了
有 \(n\) 只熊和若干桶果汁和恰好一桶酒,每一天每只熊会选择一些桶(可能不选)并各喝一 杯,喝到酒的熊会去睡觉并不再回来,通过这个信息,熊们想知道哪个桶里是酒。
只有 \(p\) 个睡 觉的位置,当睡觉的熊超过了 \(p\) 只或者所有熊都在睡觉时熊们就失败了。
令 \(R_i\) 表示在 \(i\) 天内桶的数量最多少,使得熊可以成功知道酒的位置。令 \(X_i = (i\times R_i) \bmod 2^{32}\),你需要求出 \(X_1 \oplus X_2 \oplus\ldots \oplus X_q\)。
\(1\leq n\leq 10^9\),\(1\leq p\leq 130\),\(1\leq q \leq 2\times 10^6\)。
解题思路
之前在XJ杂题选讲时候的神奇题目
题目比较乱但是我们发现题目问的是最多的数量,而不是最劣情况下的最多数量,所以这个东西是在最优情况下能分辨的数量。
这是我们之前很少接触的一种形式,这里需要用到信息的概念,因为我们是最优的,相当于我们所有的情况都可以去尝试,也就是每种信息都可以为我们选出一个答案,那么显然我们让选出的这些答案两两不同肯定就是最优的,所以这里的\(R_i\)就表示\(i\)天以内我们能够获取的信息的数量
那么我们现在能够得到的信息数就是有多少头熊睡着了,和分别在哪一天睡着的,那么有
\]
也就是组合睡觉的熊,然后每个睡觉的都可以在任意天的时候睡觉
这个东西主要是\(\binom{n}{j}\)因为没有逆元比较麻烦,但是因为\(j\)比较小所以我们可以直接暴力枚举上下的因子然后消掉他们的\(gcd\)就好了
时间复杂度\(O(p^3\log p+q\times p)\)
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
int n,p,q;
unsigned ans,f[300];
vector<int> a,b;
int main()
{
scanf("%d%d%d",&n,&p,&q);
p=min(n-1,p);
for(int i=0;i<=p;i++){
a.clear();b.clear();f[i]=1;
for(int j=0;j<i;j++)a.push_back(n-j);
for(int j=1;j<=i;j++)b.push_back(j);
for(int x=0;x<a.size();x++)
for(int y=0;y<b.size();y++){
int d=__gcd(a[x],b[y]);
a[x]/=d;b[y]/=d;
}
for(int x=0;x<a.size();x++)f[i]=1u*a[x]*f[i];
}
for(int i=1,t=1;i<=q;i++){
unsigned tmp=0,k=1;
for(int j=0;j<=p;j++,k=1u*i*k)
tmp+=f[j]*k;
ans^=1u*i*tmp;
}
printf("%u",ans);
}
CF643F-Bears and Juice【组合数学】的更多相关文章
- Codeforces 643F - Bears and Juice(思维题)
Codeforces 题目传送门 & 洛谷题目传送门 首先直接暴力枚举显然是不现实的,我们不妨换个角度来处理这个问题,考虑这 \(R_i\) 个瓶子中每一瓶被哪些熊在哪一天喝过. 我们考虑对这 ...
- 【BZOJ-4435】Juice Junctions 最小割树(分治+最小割)+Hash
4435: [Cerc2015]Juice Junctions Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 20 Solved: 11[Submi ...
- poj 3734 Blocks 快速幂+费马小定理+组合数学
题目链接 题意:有一排砖,可以染红蓝绿黄四种不同的颜色,要求红和绿两种颜色砖的个数都是偶数,问一共有多少种方案,结果对10007取余. 题解:刚看这道题第一感觉是组合数学,正向推了一会还没等推出来队友 ...
- ural 2071. Juice Cocktails
2071. Juice Cocktails Time limit: 1.0 secondMemory limit: 64 MB Once n Denchiks come to the bar and ...
- 组合数学or not ---- n选k有重
模板问题: 1. 取物品 (comb.pas/c/cpp) [问题描述] 现在有n个物品(有可能相同),请您编程计算从中取k个有多少种不同的取法.[输入] 输入文件有两行,第一行包含两个整数n,k(2 ...
- 组合数学(全排列)+DFS CSU 1563 Lexicography
题目传送门 /* 题意:求第K个全排列 组合数学:首先,使用next_permutation 函数会超时,思路应该转变, 摘抄网上的解法如下: 假设第一位是a,不论a是什么数,axxxxxxxx一共有 ...
- uestc1888 Birthday Party 组合数学,乘法原理
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=25539#problem/G 题目意思: 有n个人,每个人有一个礼物,每个人能拿 ...
- UVA 11076 Add Again 计算对答案的贡献+组合数学
A pair of numbers has a unique LCM but a single number can be the LCM of more than one possiblepairs ...
- POJ3252——Round Number(组合数学)
Round Numbers DescriptionThe cows, as you know, have no fingers or thumbs and thus are unable to pla ...
随机推荐
- windows下删除文件夹里的 .svn
windows下: 删除文件夹里的 .svn, cmd 进入相应目录 运行 for /r ./ %a in (./) do @if exist "%a/.svn" rd ...
- 2020年秋游戏开发-Gluttonous Snake
此作业要求参考https://edu.cnblogs.com/campus/nenu/2020Fall/homework/11577 GitHub地址为https://github.com/15011 ...
- python之数据库编程
python之数据库编程 sqlite 1.前期准备工作 导入模块: import sqlite3 连接数据库 conn = sqlite3.connect("test.db") ...
- 浅谈可持久化Trie与线段树的原理以及实现(带图)
浅谈可持久化Trie与线段树的原理以及实现 引言 当我们需要保存一个数据结构不同时间的每个版本,最朴素的方法就是每个时间都创建一个独立的数据结构,单独储存. 但是这种方法不仅每次复制新的数据结构需要时 ...
- vue 用driver 添加用户引导
npm 安装: npm install driver.js //用户引导 import Driver from 'driver.js' import 'driver.js/dist/driver.mi ...
- 一、docker部署Jenkins
1.部署启动脚本: [root@node10 docker-data]# cat start.sh docker run -d \ --restart=unless-stopped \ -v /opt ...
- 批量修改Linux密码脚本(Python)
搭建环境 centos 7.4 使用脚本 python 批量修改connect用户的密码 生成密码为随机密码 保存为xls文档 #!/usr/bin/env python # -*- coding: ...
- 如何让阿三 Windows 10、11 的恢复分区(Recovery Partition)恢复到 “盖茨” 模式
如何将 Windows Server 2022 的恢复分区(Recovery Partition)移动到 C 盘之前,恢复 C 盘容量调整功能. 请访问原文链接:https://sysin.org/b ...
- [Linux系列]DNS系列理论笔记与DNS服务器配置
0x01 基础术语 DNS(Domain Name System,域名系统),域名和IP地址相互映射的一个分布式数据库,简而言之就是通过更易记忆的域名代替IP去访问一个网站. FQDN(Fully Q ...
- JS预编译过程
GO和AO 变量的预编译 实例1 console.log(a); var a=1; console.log(a); 实际编译过程: 将a存入预编译对象中,赋值为undefined: 真正的赋值语句当程 ...