#include<stdio.h> #include<string.h> #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define max 500010 int sum[max<<2]; char Name[max][20]; int num[max]; int Max_fprime[max]; int Max_num[max]; int N,K; void get_fprime()//求解反素数 { for(int i=1; i<max; i++) for(int j=i; j<max; j+=i) Max_fprime[j]++; for(int i=1; i<=max; i++) Max_num[i]=Max_fprime[i]>Max_fprime[Max_num[i-1]]?i:Max_num[i-1]; } void build(int l,int r,int rt) { sum[rt]=r-l+1; if(r==l) return ; int m=(r+l)>>1; build(lson); build(rson); } int update(int x,int l,int r,int rt) { sum[rt]--; if(l==r) { return l ; } int m=(l+r)>>1,ret; if(sum[rt<<1]>=x) ret=update(x,lson); else { x-=sum[rt<<1]; ret=update(x,rson); } return ret; } int calNext(int cur, int next, int size) { if (next < 0) next++; return (((cur + next - 1) % size) + size - 1) % size + 1; } int deal(int n, int k) { int ret = 0, tmp = 0; build(1, n, 1); num[0] = k + 1; for (int i = 0, e = Max_num[n]; i < e; i++) { ret = calNext(ret, num[tmp], n - i); tmp = update(ret, 1, n, 1); } return tmp; } int main() { get_fprime(); while(scanf("%d%d",&N,&K)!=EOF) { for(int i=1; i<=N; i++) { scanf("%s %d",Name[i],&num[i]); } printf("%s %d\n", Name[deal(N, K)], Max_fprime[Max_num[N]]); } return 0; }