跪跪跪、、、、、
高精度
本来想记忆化 结果范围太大 乱搞辣
#include <cstdio>
#include <cstring>
int T;
struct bigint {
int a[30],l;
bigint () {
memset(a,0,sizeof a);
l = 1;
}
void zero () {
while(a[l] == 0 && l != 1)
l--;
}
void read () {
char s[101];
memset(s,0,sizeof s);
scanf("%s",s);
int le = strlen(s) - 1;
int t = 1;
for(int i = le;i >= 0;i--) {
a[l] += (s[i] - '0') * t;
t *= 10;
if(t == 10000) {
l++;
t = 1;
}
}
}
bigint operator / (const int b) {
bigint re = *this;
for(int i = l;i >= 2;i--) {
if(re.a[i] % 2) {
re.a[i]--;
re.a[i - 1] += 10000;
}
re.a[i] /= 2;
}
re.a[1] /= 2;
while(re.a[re.l] == 0 && re.l != 1)
re.l--;
return re;
}
bigint operator + (const bigint &b) {
bigint c;
c.l = l > b.l ? l + 1 : b.l + 1;
for(int i = 1;i <= c.l;i++) {
c.a[i] += a[i] + b.a[i];
c.a[i + 1] += c.a[i] / 10000;
c.a[i] %= 10000;
}
c.zero();
return c;
}
void print () {
printf("%d",a[l]);
for(int i = l - 1;i >= 1;i--)
printf("%04d",a[i]);
printf("\n");
}
}n,o,z,p,q;
void dfs (bigint N) {
if(N.a[1] == 1 && N.l == 1) {
p = o;
q = z;
return;
}
dfs((N + o) / 2);
if(N.a[1] & 1)
p = p + q;
else q = q + p;
}
int main () {
o.a[1] = 1;
scanf("%d",&T);
while(T--) {
n.l = 1;
memset(n.a,0,sizeof(n.a));
n.read();
dfs(n);
p.print();
}
}