原题:小明把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
输出结果
原文:https://www.cnblogs.com/wzsyyh/p/12147310.html