HDU 5565:Clarke and baton
Clarke and baton
克拉克是一名人格分裂患者。某一天,克拉克fork出了nn个自己,序号从11到nn。
他们准备玩一个减肥游戏,每一个克拉克都有一个体重a[i]a[i]。他们有一个接力棒,这个接力棒任何时刻总是在最重的克拉克(如果重量相同则在序号最小的)的手中,得到这个接力棒的克拉克需要减肥,使得体重变成a[i]-1a[i]−1,随后接力棒便传递到下一个人(可以是自己)的手中。
现在克拉克们知道接力棒一共被传递过qq次,他们想知道最终每一个克拉克的体重分别是多少。
第一行一个整数T(1 \le T \le 10)T(1≤T≤10),表示数据的组数。
每组数据只有一行三个整数n, q, seed(1 \le n, q \le 10000000, \sum n \le 20000000, 1 \le seed \le 10^9+6)n,q,seed(1≤n,q≤10000000,∑n≤20000000,1≤seed≤109+6),分别表示克拉克的个数、接力棒传递次数还有一个随机种子。
a[i]a[i]按照以下规则生成: long long seed;
int rand(int l, int r) {
static long long mo=1e9+7, g=78125;
return l+((seed*=g)%=mo)%(r-l+1);
} int sum=rand(q, 10000000);
for(int i=1; i<=n; i++) {
a[i]=rand(0, sum/(n-i+1));
sum-=a[i];
}
a[rand(1, n)]+=sum;
每组数据输出一行一个数,这个数ansans是这样得到的。
假设b[i]b[i]是最终克拉克们的体重,则ans=(b[1]+1) xor (b[2]+2) xor ... xor (b[n]+n)ans=(b[1]+1)xor(b[2]+2)xor...xor(b[n]+n),其中xorxor是异或操作。
1
3 2 1
20303
首先a[1]=20701, a[2]=31075, a[3]=26351a[1]=20701,a[2]=31075,a[3]=26351
第一次接力棒在22号克拉克手上,所以a[2]=31074a[2]=31074。
第二次接力棒在22号克拉克手上,所以a[2]=31073a[2]=31073。
所以答案等于(20701+1)xor(31073+2)xor(26351+3)=20303(20701+1)xor(31073+2)xor(26351+3)=20303
模拟题。
从最大的那个数开始减少,每一轮对当前已经有的数进行减一,减去的次数跟Q进行比较,注意大于Q的时候要 求一个rest。
代码:
#pragma warning(disable:4996)
#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#include <queue>
using namespace std; typedef long long ll;
const int maxn = 1e7 + 1;
const int mod = 1e9 + 7;
const int G = 78125; ll n, q, seed;
int a[10000002];
int nu[10000002];
int rand(int lll, int r)
{
static ll mo = 1e9 + 7, g = 78125;
return lll + ((seed *= g) %= mo) % (r - lll + 1);
} int main()
{
//freopen("i.txt","r",stdin);
//freopen("o.txt","w",stdout); int t, sum, mt, rest, res, num, cnt;
ll ans;
scanf("%d", &t); while (t--)
{
scanf("%lld%lld%lld", &n, &q, &seed); mt = 0;
sum = rand(q, 10000000); for (int i = 1; i <= n; i++)
{
a[i] = rand(0, sum / (n - i + 1));
sum -= a[i];
mt = max(mt, a[i]);
}
int tmp = rand(1, n);
a[tmp] += sum;
mt = max(mt, a[tmp]); memset(nu, 0, sizeof(nu));
for (int i = 1;i<=n; i++)
{
nu[a[i]]++;
}
num = 0;
cnt = 0;
for (int i = mt;; i--)
{
if (cnt >= q)
{
rest = q - (cnt - num);
res = i + 1;
break;
}
if (i >= 0)
{
num += nu[i];
}
cnt += num;
}
ans = 0;
for (int i = 1; i <= n; i++)
{
if (a[i] < res)
{
ans ^= (a[i] + i);
}
else
{
if (rest > 0)
{
rest--;
ans ^= (res - 1 + i);
}
else
{
ans ^= (res + i);
}
}
}
printf("%lld\n", ans);
} //system("pause");
return 0;
}
HDU 5565:Clarke and baton的更多相关文章
- HDU 5564:Clarke and digits 收获颇多的矩阵快速幂 + 前缀和
Clarke and digits Accepts: 16 Submissions: 29 Time Limit: 5000/3000 MS (Java/Others) Memory Limi ...
- HDU 5464:Clarke and problem
Clarke and problem Accepts: 130 Submissions: 781 Time Limit: 2000/1000 MS (Java/Others) Memory L ...
- HDU - 5628:Clarke and math (组合数&线性筛||迪利克雷卷积)
题意:略. 思路:网上是用卷积或者做的,不太会. 因为上一题莫比乌斯有个类似的部分,所以想到了每个素因子单独考虑. 我们用C(x^p)表示p次减少分布在K次减少里的方案数,由隔板法可知,C(x^p)= ...
- hdu 5565 Clarke and baton 二分
Clarke and baton Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php? ...
- HDU - 6409:没有兄弟的舞会(数学+思维)
链接:HDU - 6409:没有兄弟的舞会 题意: 题解: 求出最大的 l[i] 的最大值 L 和 r[i] 的最大值 R,那么 h 一定在 [L, R] 中.枚举每一个最大值,那么每一个区间的对于答 ...
- POJ 3321:Apple Tree + HDU 3887:Counting Offspring(DFS序+树状数组)
http://poj.org/problem?id=3321 http://acm.hdu.edu.cn/showproblem.php?pid=3887 POJ 3321: 题意:给出一棵根节点为1 ...
- HDU 2732:Leapin' Lizards(最大流)
http://acm.hdu.edu.cn/showproblem.php?pid=2732 题意:给出两个地图,蜥蜴从一个柱子跳跃到另外一个地方,那么这个柱子就可能会坍塌,第一个地图是柱子可以容忍跳 ...
- HDU 4289:Control(最小割)
http://acm.hdu.edu.cn/showproblem.php?pid=4289 题意:有n个城市,m条无向边,小偷要从s点开始逃到d点,在每个城市安放监控的花费是sa[i],问最小花费可 ...
- HDU 3605:Escape(最大流+状态压缩)
http://acm.hdu.edu.cn/showproblem.php?pid=3605 题意:有n个人要去到m个星球上,这n个人每个人对m个星球有一个选择,即愿不愿意去,"Y" ...
随机推荐
- Dart语言学习(二) Dart的常量和变量
1.使用var声明变量,可赋予不同类型的值 Dart是一个强大的脚本类语言,可以不预先定义变量类型 ,自动会类型推导 Dart中定义变量可以通过var关键字可以通过类型来申明变量 var str='t ...
- 在服务器CentOS7版本安装Nginx
简介 经常用使用Nginx来部署我们的网站,我的服务器是CentOS7.我不喜欢使用下载一个Nginx解压包然后解压的那种,我喜欢下面的这种. 安装 yum包管理工具是不带nginx,所以得先添加,在 ...
- buuctf Easysql 小记
堆叠注入 利用原理: 补充系统变量@@sql_modesql_mode:是一组mysql支持的基本语法及校验规则PIPES_AS_CONCAT:将“||”视为字符串的连接操作符而非或运算符,这和Ora ...
- oracle 基础sql语句
修改date日期时间: update T2_FOODS_STORAGE_IN set create_time =to_date('2020-01-15 12:30:20','yyyy-mm-dd hh ...
- 多进程manager共享
使用manager在进程之间事项共享数据. 栗子: 主进程调用manager,创建一个字典d和一个列表l,启动十个子进程,每个子进程都向d和l中放数据 from multiprocessing imp ...
- C语言传递二维数组
方法一, 形参给出第二维的长度. 例如: #include <stdio.h> ] ) { int i; ; i < n; i++) printf("/nstr[%d] = ...
- maven搭建父子项目
父工程:父工程又称为父控制器,只是一个简单的工程,不能单独运行.作用是将子模块跟子工程聚合在一起.父控制器中的pom.xml配置,在子模块跟子工程中都可以被继承. 子工程:项目中创建的具有业务逻辑并且 ...
- BeanUtils学习笔记
一. 简介 BeanUtils提供对Java反射和自省API的包装.其主要目的是利用反射机制对JavaBean的属性进行简化操作处理.一个JavaBean通常包含了大量的属性,很多情况下,对JavaB ...
- Cisco AP-Sniffer模式空口抓包
第一步:WLC/AP侧 配置AP为sniffer模式: 配置提交后,AP会重启,并且将不能发出SSID为clients提供服务. 第二步:一旦AP重新加入WLC,配置AP抓取的信道和抓取后的数据包发 ...
- [蓝桥杯2017初赛]k倍区间 前缀和
题目描述 给定一个长度为N的数列,A1, A2, ... AN. 如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数,我们就称这个区间[i, j]是K倍区间. ...