[ZJOI2012]数列
超级水的题还wa了一次
首先很容易发现其实就只有两个值并存
然后 要注意把数组初始化啊。。。可能后面有多余的元素(对拍的时候由于从小到大就没跑出错)
#include <bits/stdc++.h> using namespace std; int a[170],b[170],a1[170],a2[170],x1[170],x2[170]; bool t; char s[170]; void cf(int *a) { int x=0; for (int i=150;i>=1;i--) { b[i]=(x*10+a[i])/2; x=(x*10+a[i])%2; } memcpy(a,b,sizeof(b)); } void calc1(int *a,int *b) { int x=1; for (int i=1;i<=150;i++) { b[i]=(a[i]+x)%10; x=(a[i]+x)/10; } } void calc2(int *a,int *b) { int x=1; for (int i=1;i<=150;i++) { if (x==1) { if (a[i]==0) b[i]==9; else b[i]=a[i]-1,x=0; } else b[i]=a[i]; } } int pd(int *a) { int u=0; for (int i=150;i>=2;i--) if (a[i]>0) u=9; if (!u) { if (a[1]==0) return(0); else if (a[1]==1) return(1); } return(2); } void cc(int *a1,int *a2) { int x=0; for (int i=1;i<=150;i++) { b[i]=(a1[i]+a2[i]+x)%10; x=(a1[i]+a2[i]+x)/10; } memcpy(a1,b,sizeof(b)); } void dfs() { while (true) { int tmp=pd(a1); if (tmp==0) { memcpy(x1,x2,sizeof(x2)); return ; } else if (tmp==1) { cc(x1,x2); return ; } if (!pd(x2)) { if (a1[1]%2==0) cf(a1); else { cf(a1); calc1(a1,a2); memcpy(x2,x1,sizeof(x1)); } } else { if (a1[1]%2==0) { cf(a1); calc1(a1,a2); cc(x1,x2); } else { cf(a2); calc2(a2,a1); cc(x2,x1); } } } } int main() { int T; cin>>T; for (int i=1;i<=T;i++) { cin>>s; memset(a,0,sizeof(a)); for (int i=0;i<strlen(s);i++) a[i+1]=s[strlen(s)-i-1]-'0'; memset(x1,0,sizeof(x1)); memset(x2,0,sizeof(x2)); x1[1]=1; memcpy(a1,a,sizeof(a)); dfs(); int j; for (j=150;j;j--) if (x1[j]) break; for (int k=j;k;k--) cout<<x1[k]; if (j==0) cout<<0; cout<<endl; } return 0; }