#include <stdio.h>
int main()
{
int n;
int flag[14] = {0, 2,7,5,30,169,441,1872,7632,1740,93313,459901,1358657,2504881};
while(scanf("%d", &n)!=EOF && n)
printf("%d\n", flag[n]);
return 0;
}
剛開始沒有打表竟然超時,我類個擦~~~
具體思路就是每次殺掉的人的編號都必須大於k,每次殺掉一個人後就重新編號,當然前面k個good guys編號不變,殺掉一個人後可以求他右邊剩餘的個數,(ans + right)%left即爲下一次要殺的人,如果殺的是good guys則失敗,否則繼續殺~~~~
left爲剩餘的人的個數
#include <stdio.h>
int main()
{
int n, ans, left, right, kill;
for(n=1; n<14; n++){
for(ans=n+1; ; ans++)
{
right = 0;/
for(left = 2*n; left > n; left--)//需要殺n個人
{
kill = (ans - right) % left;//下一次要殺的人
if(kill == 0)//取0表示殺最後一個~~~
kill = left;
if(kill >=1 && kill <= n)//殺到good guys了,繼續下一個值的測試~~
goto X;
right = left - kill;
}
printf("%d,", ans);
break;
X:
continue;
}
}
return 0;
}