推了好久啊。看来以后要多玩扫雷了qwq.
其实本题只有三种答案:0、1、2.
对于所有第一列,只要第一个数和第二个数确定后,其实整个数列就确定了,我们可以通过这个递推式得出
1 sec[i-1]=fir[i]+fir[i-2]+fir[i-1]
所以我们可以枚举每列的第1/2个数。
如果推到第n+1个数还存在,那么指定这种情况不成立。
Code
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #define maxn 10090 5 6 using namespace std; 7 8 int n,ans; 9 int fir[maxn],sec[maxn]; 10 11 bool check() 12 { 13 for(int i=3;i<=n+1;i++) 14 fir[i]=sec[i-1]-fir[i-2]-fir[i-1]; 15 if(fir[n+1]) return false; 16 return true; 17 } 18 19 int main() 20 { 21 scanf("%d",&n); 22 for(int i=1;i<=n;i++) scanf("%d",&sec[i]); 23 for(int k=0;k<=sec[1];k++) 24 { 25 memset(fir,0,sizeof(fir)); 26 fir[1]=k; 27 fir[2]=sec[1]-k; 28 if(check()) ans++; 29 } 30 printf("%d",ans); 31 return 0; 32 }