Who Gets the Most Candies?
Time Limit: 5000MS | Memory Limit: 131072K | |
Total Submissions: 11303 | Accepted: 3520 | |
Case Time Limit: 2000MS |
Description
N children are sitting in a circle to play a game.
The children are numbered from 1 to N in clockwise order. Each of them has a card with a non-zero integer on it in his/her hand. The game starts from the K-th child, who tells all the others the integer on his card and jumps out of the
circle. The integer on his card tells the next child to jump out. Let A denote the integer. If A is positive, the next child will be the A-th child to the left. If A is negative, the next child will be the (−A)-th
child to the right.
The game lasts until all children have jumped out of the circle. During the game, the p-th child jumping out will get F(p) candies where F(p) is the number of positive integers that perfectly divide p.
Who gets the most candies?
Input
(consisting of at most 10 letters) and the integers (non-zero with magnitudes within 108) on their cards in increasing order of the children’s numbers, a name and an integer separated by a single space in a line with no leading or trailing
spaces.
Output
Output one line for each test case containing the name of the luckiest child and the number of candies he/she gets. If ties occur, always choose the child who jumps out of the circle first.
Sample Input
- 4 2
- Tom 2
- Jack 4
- Mary -1
- Sam 1
Sample Output
- Sam 3
- 这道题可以用线段树做,是很有趣的一道,用到了约瑟夫环和反素数表。反素数的定义:对于任何正整数x,其约数的个数记做g(x).例如g(1)=1,g(6)=4.如果某个正整数x满足:对于任意i(0<i<x),都有g(i)<g(x),则称x为反素数·在这道题中,要求的就是不超过n的最大反素数p,因为它的因数最多,即只要找出第p个跳出孩子的编号。另一个用到的是约瑟夫环公式,设跳出的小孩编号是k,当孩子拿的号码是正数A时,如果A=1,那么下个要跳出的编号是K,此时对应的A是1,那么可设起点编号是k-1,对应的A是0,则其通项公式是k=(k-1+A-1)%n+1;(这里采用先顺时针走A-1步,再顺时针走最后一步,是为了避免出现取余后结果是0的情况),如果A小于0,那么同理可以得到对应编号为0所对应的编号为k-1,采用先逆时针走-A-1,在顺时针走一步的方法,得到公式k=((k-1+A)%n+n)%n+1;注意这里的A对应的是最初原始排列的小孩手里拿的编号,是搜到的线段树的叶节点。
- #include<stdio.h>
- #include<string.h>
- char s[500005][11];
- int num[500005];
- int a[37]={1,2,4,6,12,24,36,48,60,120,180,240,360,720,840,1260,1680,2520,5040,7560,10080,15120,20160,25200,27720,45360,50400,
- 55440,83160,110880,166320,221760,277200,332640,498960,500001};
- int c[37]={1,2,3,4,6,8,9,10,12,16,18,20,24,30,32,36,40,48,60,64,72,80,84,90,96,100,108,120,128,144,160,168,180,192,200,1314521};
- struct node
- {
- int l,r,pos;
- }b[4*500005];
- void build(int l,int r,int i)
- {
- int mid;
- b[i].l=l;b[i].r=r;
- if(l==r){
- b[i].pos=1;return;
- }
- mid=(l+r)/2;
- build(l,mid,i*2);
- build(mid+1,r,i*2+1);
- b[i].pos=b[i*2].pos+b[i*2+1].pos;
- }
- int update(int pos,int i)
- {
- int mid;
- if(b[i].l==b[i].r){
- b[i].pos=0;return b[i].l;
- }
- b[i].pos--;
- if(b[i*2].pos>=pos){
- return update(pos,i*2);
- }
- else return update(pos-b[i*2].pos,i*2+1);
- }
- int main()
- {
- int n,m,i,j,max,p,k,h;
- while(scanf("%d%d",&n,&k)!=EOF)
- {
- memset(s,0,sizeof(s));
- memset(num,0,sizeof(num));
- build(1,n,1);
- for(i=1;i<=n;i++){
- scanf("%s%d",s[i],&num[i]);
- }
- i=1;
- while(a[i]<=n){
- i++;
- }
- max=c[i-1];
- p=a[i-1];
- for(i=1;i<=p;i++){
- n--;
- h=update(k,1); //h是最初始孩子的编号,也是线段树的叶节点
- if(n==0)break; //很重要!
- if(num[h]>0)
- k=(k-1+num[h]-1)%n+1;
- else k=((k-1+num[h])%n+n)%n+1;
- //printf("%d\n",h);
- }
- printf("%s %d\n",s[h],max);
- }
- return 0;
- }
Who Gets the Most Candies?的更多相关文章
- 【POJ2886】Who Gets the Most Candies?-线段树+反素数
Time Limit: 5000MS Memory Limit: 131072K Case Time Limit: 2000MS Description N children are sitting ...
- poj 3159 Candies 差分约束
Candies Time Limit: 1500MS Memory Limit: 131072K Total Submissions: 22177 Accepted: 5936 Descrip ...
- Who Gets the Most Candies?(线段树 + 反素数 )
Who Gets the Most Candies? Time Limit:5000MS Memory Limit:131072KB 64bit IO Format:%I64d &am ...
- poj---(2886)Who Gets the Most Candies?(线段树+数论)
Who Gets the Most Candies? Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 10373 Acc ...
- poj3159 Candies(差分约束,dij+heap)
poj3159 Candies 这题实质为裸的差分约束. 先看最短路模型:若d[v] >= d[u] + w, 则连边u->v,之后就变成了d[v] <= d[u] + w , 即d ...
- HDU 5127 Dogs' Candies
Dogs' Candies Time Limit: 30000/30000 MS (Java/Others) Memory Limit: 512000/512000 K (Java/Others) T ...
- C. Om Nom and Candies 巧妙优化枚举,将复杂度控制在10e6
C. Om Nom and Candies 无线超大背包问题 #include <iostream> #include <cstdio> #include <cstrin ...
- POJ 3159 Candies (栈优化spfa)
Candies 题目链接: http://acm.hust.edu.cn/vjudge/contest/122685#problem/J Description During the kinderga ...
- POJ 3159 Candies(差分约束,最短路)
Candies Time Limit: 1500MS Memory Limit: 131072K Total Submissions: 20067 Accepted: 5293 Descrip ...
- (poj)3159 Candies
题目链接:http://poj.org/problem?id=3159 Description During the kindergarten days, flymouse was the monit ...
随机推荐
- LeetCode106 从中序和后序序列构造二叉树
题目描述: 根据一棵树的中序遍历与后序遍历构造二叉树. 注意:你可以假设树中没有重复的元素. 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 postorder = [ ...
- 牛客剑指Offer-数字在升序数组中出现的次数
题目 统计一个数字在升序数组中出现的次数. 示例1 输入 [1,2,3,3,3,3,4,5],3 返回值 4 题解 第一种最简单的方法是O(n)复杂度.遍历数组统计结果. public int Get ...
- IPC 经典问题:Reader & Writer Problem
完整代码实现: #include <stdio.h> #include <unistd.h> #include <time.h> #include <stdl ...
- Linux简单Shell脚本监控MySQL、Apache Web和磁盘空间
Linux简单Shell脚本监控MySQL.Apache Web和磁盘空间 1. 目的或任务 当MySQL数据库.Apache Web服务器停止运行时,重新启动运行,并发送邮件通知: 当服务器磁盘的空 ...
- Docker学习笔记之Dockerfile
Dockerfile的编写格式为<命令><形式参数>,命令不区分大小写,但一般使用大写字母.Docker会依据Dockerfile文件中编写的命令顺序依次执行命令.Docker ...
- python学习笔记 | 递归思想
1.引子 大师 L. Peter Deutsch 说过: To Iterate is Human, to Recurse, Divine. 中文译为:人理解迭代,神理解递归 2.什么是递归 简单理解: ...
- 【Problems】端口被占用 查看是被谁占用并关闭它
文章目录 Windows Linux 经常在Windows.Linux环境下运行JavaWeb项目,Tomcat的端口被占用了. 端口被占用就查看是被谁占用关闭它就行. Windows 在Window ...
- 攻防世界 - Web(二)
supersqli: (!!!) 1.判断有误注入,1'报错, 1' 报错,1'# 正常且为True,1' and 1=1# 正常且为True,1' and 1=2# 正常且为False,所以它里边存 ...
- Pulsar 社区周报|2021-01-11~2021-01-17
Pulsar 周报由 StreamNative 翻译整理.原文内容来自 StreamNative 官网 Pulsar 周报模块. 本期编辑:Tango@StreamNative. 关于 Apache ...
- ASP.NET Core错误处理中间件[4]: 响应状态码页面
StatusCodePagesMiddleware中间件与ExceptionHandlerMiddleware中间件类似,它们都是在后续请求处理过程中"出错"的情况下利用一个错误处 ...