1875 丢手绢
1875丟手絹
六一兒童節到了,小朋友們在玩丟手絹的游戲。總共有C個小朋友,編號從1到C,他們站成一個圈,第i(1<i<=C)個人的左邊是i-1,第1個人的左邊是C。第i(1<=i<C)個人的右邊是i+1,第C個人的右邊是1。然后再給出一個常數E。剛開始的時候1號小朋友拿著手絹,接下來游戲開始,在游戲的每一輪,拿手絹的人會把手絹向右邊傳遞E-1個人,拿到手絹的人退出圈,把手絹遞給他右邊的小朋友,剩下的人向中間挨緊,把圈中的空位補滿。然后開始下一輪,如此往復。直到圈中只剩一個人。比如C=6,E=5的時候,出圈的順序是5,4,6,2,3,最后1號小朋友留在了圈中。
現在有2G個小朋友,要求一個最小的常數E,使得這2G個小朋友玩了G輪游戲之后,出圈的小朋友編號剛好是G+1到2G。
Input
多組測試數據。 每一行給出一個整數G(0<G<14),G=0的時候表示輸入結束。
Output
輸出多行,表示每一組數據的答案。
Input示例
3 4 0
Output示例
5 30
此題我沒有發現任何技巧,所以我選擇打表
12,13跑了有半個小時還要多
1 #include <cctype>
2 #include <cstdio>
3
4 const int MAXN=30;
5
6 int n;
7
8 int next[MAXN],from[MAXN],f[MAXN];
9
10 inline bool pd(int num,int x) {
11 for(int i=2;i<2*x;++i) next[i]=i+1,from[i]=i-1;
12 next[1]=2;from[1]=x*2;next[2*x]=1;from[x*2]=2*x-1;
13 int i=1,t=1,s=2*x;
14 while(s>x) {
15 if(t==num) {
16 if(i<=x) return false;
17 int p=from[i];
18 int nx=next[i];
19 next[p]=nx;from[nx]=p;
20 --s;
21 t=1;i=nx;
22 }
23 i=next[i];
24 ++t;
25 }
26 return true;
27 }
28
29 int hh() {
30 f[1]=2;
31 for(int i=2;i<=14;++i) {
32 for(int j=i+1;;++j)
33 if(pd(j,i)) {f[i]=j;printf("%d ",f[i]);break;}
34 }
35 for(int i=1;i<=14;++i) printf("%d ",f[i]);
36 return 0;
37 }
38
39 int sb=hh();
40 int main(int argc,char**argv) {;}
打表程序
1 #include <cctype>
2 #include <cstdio>
3
4 const int MAXN=14;
5
6 int n;
7
8 int f[MAXN]={0,2,7,5,30,169,441,1872,7632,1740,93313,459901,1358657,2504881};
9
10 int hh() {
11 while(scanf("%d",&n)) {
12 if(n==0) break;
13 printf("%d
",f[n]);
14 }
15 return 0;
16 }
17
18 int sb=hh();
19 int main(int argc,char**argv) {;}
標程
總結
- 上一篇: 10G的变态SQL文件,如何快速打开编辑
- 下一篇: 广电总局:古装剧服装要符合史实、坚决抵制