X-man

导航

hdu 2211 杀人游戏

设f(N,K)返回最后取出的编号

那么f(n,k)进行第一次选后,剩下n-n/k个人,这剩下的人里最后被取出的编号为f(n-n/k,k)记为x
那么它在前一次队列里的编号则是(x-1)/(k-1)+x
所以f(n,k)=(x-1)/(k-1)+x 其中x=f(n-n/k,k)

#include<stdio.h>
int cal(int n,int k)
{
    if(n==k)return k;
    int m=cal(n-n/k,k);
    return (m-1)/(k-1)+m;
}
int main()
{
    int _case;
    int n,k;
    scanf("%d",&_case);
    while(_case--)
    {
        scanf("%d%d",&n,&k);
        printf("%d\n",cal(n,k));
    }
    return 0;
}

 

posted on 2013-08-11 17:05  雨钝风轻  阅读(454)  评论(0编辑  收藏  举报