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 theK-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. LetA denote the integer. If A is positive, the next child will be theA-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, thep-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

There are several test cases in the input. Each test case starts with two integers N (0 < N ≤ 500,000) and K (1 ≤ KN) 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.

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

Source


心情不好,若干脑残错误==

题意:N个小孩坐一圈,每个小孩有一个数字,开始时第k个出列,出列的这个小孩的数字是整数,往右数这个数个下一个出列;负数,往左数个小孩出列。以此类推,第p个出列的小孩得到的糖果数是p的约数个数,问最多得糖果的是谁,得了几个。

首先反素数打个表,我就直接贴的网上的数据了。然后,坐成圈就让我想到把环扩二倍orz根本用不着啊,取模就够了啊。绝对位置等于当前位置+/-相对位置,其实没多难的题就是想不到啊啊啊啊啊

/***************
poj2886
2016.3.8
21804K	1157MS	C++	1822B
***************/
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 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 b[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};
char name[maxn][15];
int pos[maxn];
struct node
{
    int l,r,tot;
}num[maxn*4];
void build(int rt,int l,int r)
{
    int mid=(l+r)/2;
    num[rt].l=l;num[rt].r=r;
    if(l==r)
    {
        num[rt].tot=1;
        return;
    }
   // printf("rt=%d tot=%d\n",rt,num[rt].tot);
    build(rt<<1,l,mid);
    build(rt<<1|1,mid+1,r);
    num[rt].tot=num[rt<<1].tot+num[rt<<1|1].tot;
}
int update(int rt,int k)
{
    num[rt].tot--;
    if(num[rt].l==num[rt].r)
        return num[rt].l;
    if(k<=num[rt<<1].tot) update(rt<<1,k);
    else update(rt<<1|1,k-num[rt<<1].tot);
}
int main()
{
    //freopen("cin.txt","r",stdin);
    int n,k;
    while(~scanf("%d%d",&n,&k))
    {
        for(int i=1;i<=n;i++)scanf("%s%d",name[i],&pos[i]);
       // for(int i=1;i<=n;i++)printf("%s% d\n",name[i],pos[i]);
        build(1,1,n);
        int cnt=0;
        while(a[cnt]<=n) cnt++;
        cnt--;
        int ps=0;
        pos[ps]=0;
      //  printf("tot=%d\n",num[1].tot);
        for(int i=0;i<a[cnt];i++)
        {
            if(pos[ps]>0)
                k = ((k + pos[ps] - 2) % num[1].tot + num[1].tot) % num[1].tot + 1;
            else k = ((k + pos[ps] - 1) % num[1].tot + num[1].tot) % num[1].tot + 1;
           // cout<<k<<endl;
            ps=update(1,k);//cout<<ps<<endl;
        }
        printf("%s %d\n",name[ps],b[cnt]);
    }
    return 0;
}