HDU1443 Joseph

来源:互联网 发布:西门子300编程演示 编辑:程序博客网 时间:2024/06/14 17:32

【题意】k个好人和k个坏人围成一圈,好人编号1~k,给定m,从1开始数第m个人被杀,然后从被杀的那个人的下一个人开始计数,如此循环,求使所有坏人被杀前没有一个好人被杀的最小的m。


枚举+直接模拟

#include<stdio.h>#include<string.h>//int ret[16]={0,2,7,5,30,169,441,1872,7632,1740,93313,459901,1358657,2504881,13482720,25779600};int a[16]={0};/*int Find(int k){for(int i=k+1;;i++){//printf("%d\n",i);int now=1,last=2*k;while(1){now=(now+i-1)%last;if(now==0)now=last;if(now<=k)break;if(now==last)now=1;last--;if(last==k)return i;}}}*/int Find(int k){for(int roll=k+1;;roll++){int now,last;for(last=2*k-1,now=(roll-1)%(last+1);;now=(now+roll-1)%(last+1)){if(now<k)break;if(last==now)now=0;last--;if(last==k-1)return roll;}}}int main(){int k;for(int i=1;i<=14;i++)a[i]=Find(i);while(scanf("%d",&k),k){printf("%d\n",a[k]);}return 0;}

一开始超时,后来将Find(i)的结果保存在a[i]就AC了~跑343MS

当然也可以打表

原创粉丝点击