lightoj 1179 - Josephus Problem 约瑟夫问题

来源:互联网 发布:猫叔盒子软件 编辑:程序博客网 时间:2024/05/21 14:52
#include <stdio.h>#include <math.h>#include <string.h>#include <algorithm>using namespace std;int c[100],f[100001];//f[i]表示0~i-1围成一圈,按k个一删最后剩下的数值。int main(){    int T,tt=0;    scanf("%lld",&T);    while(T--)    {        int n,i,j,k,s=0;        scanf("%d%d",&n,&k);        printf("Case %d: ",++tt);        f[1]=0;        for(i=2;i<=n;i++)            f[i]=(f[i-1]+k)%i;        printf("%d\n",f[n]+1);    }    return 0;}/*举例说明:n=8,k=5;01234567,第一次删除5,然后从5的位置开始编号0~6,就成了n=7,k=5的环;如果f[7]=4,想对应的在n=8中的位置就是(f[7]+5)%8=1,就说明最后剩下的是1,(这里是举例说明,实际数据可能对不上)*/


变形:从第m个开始删除:

#include <stdio.h>#include <math.h>#include <string.h>#include <algorithm>using namespace std;int c[100],f[100001];int main(){    int T,tt=0;    scanf("%lld",&T);    while(T--)    {        int n,i,j,k,s=0,m;        scanf("%d%d",&n,&k,&m);        printf("Case %d: ",++tt);        f[1]=0;        for(i=2;i<=n;i++)            f[i]=(f[i-1]+k)%i;        int ans=(m-k+1+f[n])%n;        if(ans<=n)            ans+=n;        printf("%d\n",ans);    }    return 0;}


原创粉丝点击