原题:小明把m枚硬币放在一个n个端点的线段上.定义一次“操作”:从一个至少有2枚硬币的点取走2枚硬币,分别在每个相邻的点上放1枚(若只有一个相邻点就只在一个相邻点上放1枚).对小明的每种摆法,第n个点An无硬币,则总数经过若干次“操作”,使点An处有硬币,求n的最小值。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int inline gin(){ 5 char c=getchar(); 6 int s=0; 7 while(c<'0'||c>'9'){ 8 c=getchar(); 9 } 10 while(c>='0'&&c<='9'){ 11 s=(s<<3)+(s<<1)+(c^48); 12 c=getchar(); 13 } 14 return s; 15 } 16 17 int n,a[10001],k=0; 18 19 int tf(int s){ 20 memset(a,0,sizeof(a)); 21 a[1]=s; 22 for(int i=1;i<n;i++){ 23 while(a[i]>=2){ 24 a[i+1]+=a[i]/2; 25 a[i]=a[i]%2+(a[i]/2)/2; 26 } 27 } 28 if(a[n])return 1; 29 return 0; 30 } 31 32 int main(){ 33 for(n=1;n<=20;n++){ 34 for(int i=pow(2,n-1)-1;;i--){ 35 if(!tf(i)){ 36 k=i+1; 37 break; 38 } 39 } 40 cout<<n<<" "<<k<<endl; 41 } 42 return 0; 43 }n m
1 1 2 2 3 4 4 7 5 12 6 19 7 29 8 45 9 68 10 104 11 157 12 237 13 357 14 537 15 808 16 1213 17 1821 18 2735 19 4104 20 6157 21 9237 22 13858 23 20788 24 31184
输出结果