原题目:
题目大意:把一个数拆成各种2的幂次,每个幂次最多两个,加起来,有多少种拆法
解题思路:
动态规划即可,R[i][1][2]表示为当前考虑第i位,欠0或者欠1,不用,用1个幂次,用两个幂次。
那个10的25次方C++放不下,用Python转化成二进制才行。
代码:
void solve() {
ll i, j,k,x,y,z,p,q,u,v;
ll N = 150000000,NN=15000000;
ll a[] = { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,1,0,0,0,0,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,1,0,1,0,0,0,1,0,1,0,1,0,0,1,1,0,1,0,0,0,1,0,0,0,0,1 };
R[84][0][0] = 1;
for (i = 83; i >= 0; i--) {
if (a[i] == 1) {
R[i][0][1] = R[i + 1][0][1] + R[i + 1][0][2] + R[i + 1][0][0];
R[i][1][0]= R[i + 1][0][1] + R[i + 1][0][2] + R[i + 1][0][0];
R[i][1][2] = R[i + 1][1][1] + R[i + 1][1][0] + R[i + 1][1][2];
}
else {
R[i][0][0]= R[i + 1][0][1] + R[i + 1][0][2] + R[i + 1][0][0];
R[i][0][2]= R[i + 1][1][1] + R[i + 1][1][2] + R[i + 1][1][0];
R[i][1][1]= R[i + 1][1][1] + R[i + 1][1][2] + R[i + 1][1][0];
}
}
for (i = 0; i <= 2; i++) {
ans1 = ans1 + R[0][0][i];
}
printf("%lld\n",ans1);
}