Time Limit: 5000MS Memory Limit: 131072K
Case Time Limit: 2000MSnode
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?ios
There are several test cases in the input. Each test case starts with two integers N (0 < N ≤ 500,000) and K (1 ≤ K ≤ N) on the first line. The next N lines contains the names of the children (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.markdown
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.ide
4 2
Tom 2
Jack 4
Mary -1
Sam 1ui
Sam 3
Sourcespa
POJ Monthly–2006.07.30, Sempr。code
題意:n我的,每個人手上都有一張牌,牌上的數字表示下一個出去的人的相對位置,正數爲順時針,負數爲逆時針,第i個出隊的人會獲得i的約數個糖果,問誰出隊的時候獲得的糖果最多。隊列
對於最大糖果數和出隊的次序能夠由反素數判斷。對於下一個出對的人在如今隊列中的位置能夠由相對位置決定。ip
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
const int Max = 1e6*4;
int a[] = {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,554400,665280,720720};//反素數表
int sum[] = {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,216,224,240};//反素數對應的約束的個數。
typedef struct node
{
char name[11];
int Op;
}Stu;
int Tr[Max];
Stu s[550000];
void Build(int L,int R,int st)
{
Tr[st] = (R-L+1);
if(L == R) return ;
int mid = (L + R)>>1;
Build(L,mid,st<<1);
Build(mid+1,R,st<<1|1);
}
int update(int L,int R,int st,int x)
{
Tr[st] --;
if( L == R ) return L;
int mid = (L + R)>>1;
if(x<=Tr[st<<1]) return update(L,mid,st<<1,x);
else return update(mid+1,R,st<<1|1,x-Tr[st<<1]);
}
int main()
{
int n,k;
while(~scanf("%d %d",&n,&k))
{
for(int i = 1 ;i<=n;i++)
{
scanf("%s %d",s[i].name,&s[i].Op);
}
int m = 0;
int p =0 ;
while(a[p]<=n) p++;
m = a[p-1];
int ans = p-1;
Build(1,n,1);
int Mod = n;
int pos;
while(m--)
{
pos = update(1,n,1,k);
Mod --;
if(!Mod)
{
break;
}
//下一個出隊的人的位置
if(s[pos].Op>=0) k = ((k-1+s[pos].Op-1)%Mod+Mod)%Mod+1;
else k = ((k-1+s[pos].Op)%Mod+Mod)%Mod+1;
}
printf("%s %d\n",s[pos].name,sum[ans]);
}
return 0;
}