#include<stdio.h>
#define MAX_N 500100
int s[MAX_N];
int bit[MAX_N];
int id[MAX_N];
char name[MAX_N][12];
int N,K;
void init(void)
{
int i,j,k,m;
for(i=0;i<MAX_N;i++)
s[i]=1;
for(i=2;i<=MAX_N;i++)
{
if(s[i]==1)
{
for(j=i;j<=MAX_N;j+=i)
{
k=0;
for(m=j;m%i==0;m/=i,k++);
s[j]*=k+1;
}
}
}
}
void add(int i,int x)
{
while(i<=N)
{
bit[i]+=x;
i+=i&-i;
}
}
int query(int i)
{
int sum=0;
while(i>0)
{
sum+=bit[i];
i-=i&-i;
}
return sum;
}
int find(int x)
{
int l,r,m;
l=1;r=N;
while(l<r)
{
m=(l+r)/2;
if(query(m)<x)
l=m+1;
else
r=m;
}
return l;
}
int main(void)
{
int i,num,max,pos,p,lo;
init();
while(~scanf("%d%d",&N,&K))
{
num=N;
for(i=1;i<=N;i++)
scanf("%s%d",name[i],&id[i]);
for(i=1;i<=N;i++)
add(i,1);
max=-1;
for(i=2;i<=N;i++)
if(max<s[i])
{
max=s[i];
pos=i;
}
lo=K;
while(--pos)
{
add(lo,-1);
num--;
if(id[lo]>0)
K=((K-2+id[lo])%num+num)%num+1;
else
K=((K-1+id[lo])%num+num)%num+1;
lo=find(K);
}
printf("%s %d\n",name[lo],max);
}
}
poj 2886 二分+树状数组
最新推荐文章于 2021-11-11 17:54:11 发布