[ZJOI2012]数列

时间:2022-12-01 01:58:19

超级水的题还wa了一次

首先很容易发现其实就只有两个值并存

然后 要注意把数组初始化啊。。。可能后面有多余的元素(对拍的时候由于从小到大就没跑出错)

#include <bits/stdc++.h>
using namespace std;
int a[],b[],a1[],a2[],x1[],x2[];
bool t;
char s[];
void cf(int *a)
{
int x=;
for (int i=;i>=;i--)
{
b[i]=(x*+a[i])/;
x=(x*+a[i])%;
}
memcpy(a,b,sizeof(b));
}
void calc1(int *a,int *b)
{
int x=;
for (int i=;i<=;i++)
{
b[i]=(a[i]+x)%;
x=(a[i]+x)/;
}
}
void calc2(int *a,int *b)
{
int x=;
for (int i=;i<=;i++)
{
if (x==)
{
if (a[i]==) b[i]==;
else b[i]=a[i]-,x=;
} else b[i]=a[i];
}
}
int pd(int *a)
{
int u=;
for (int i=;i>=;i--)
if (a[i]>) u=;
if (!u)
{
if (a[]==) return();
else if (a[]==) return();
}
return();
}
void cc(int *a1,int *a2)
{
int x=;
for (int i=;i<=;i++)
{
b[i]=(a1[i]+a2[i]+x)%;
x=(a1[i]+a2[i]+x)/;
}
memcpy(a1,b,sizeof(b));
}
void dfs()
{
while (true)
{
int tmp=pd(a1);
if (tmp==)
{
memcpy(x1,x2,sizeof(x2));
return ;
} else if (tmp==)
{
cc(x1,x2);
return ;
}
if (!pd(x2))
{
if (a1[]%==) cf(a1); else
{
cf(a1);
calc1(a1,a2);
memcpy(x2,x1,sizeof(x1));
}
} else
{
if (a1[]%==)
{
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=;i<=T;i++)
{
cin>>s;
memset(a,,sizeof(a));
for (int i=;i<strlen(s);i++)
a[i+]=s[strlen(s)-i-]-'';
memset(x1,,sizeof(x1));
memset(x2,,sizeof(x2));
x1[]=;
memcpy(a1,a,sizeof(a));
dfs();
int j;
for (j=;j;j--) if (x1[j]) break;
for (int k=j;k;k--) cout<<x1[k];
if (j==) cout<<;
cout<<endl;
}
return ;
}