rt
用 a 数组存储高精度数据,每个数据的高32位用来进位
head 一个数据存储a的末尾位置,即模拟一个指针
a数组前留存 100∗32 位的空白,便于2运算
主要问题就是subtask 2 没过,求hack /bx
#include<iostream>
using namespace std;
#define ll long long
ll a[15000];//low 32 bit for storage, high 32 bit for carry
void hbtPrtBin(ll x){
for(int i = 31; i>=0; i--){
if(x&1<<i) printf("1"); else printf("0");
}
return;
}
int main(){
//freopen("input.txt", "r", stdin);
int T;
cin>>T;
while(T--){
for(int i = 0; i<= 14900;i++) a[i] = 0ll;
ll head=100*32;
int n;
cin>>n;
while(n--){
int op;
scanf("%d", &op);
if(op == 1){
head++;
}
else{
ll d;
scanf("%d", &d);
//ll pos = head%32;//bit pos
ll piv = (head-1)/32+1;//index in array
ll pos = 32*(piv) - head;
a[piv]+=d<<pos;
for(ll i = piv; a[i] > (ll)0xffffffff; i--){
ll carry = a[i]>>32;
a[i-1] += carry;
a[i] -= carry<<32; //2^33-1
}
}
continue;
}
ll i=0,j=0;
//if(i<0) i = 0;
//ll pos = head%32;//bit position
ll piv = (head-1)/32+1;//index in array
ll pos = 32*(piv) - head;
while(a[i]==0&&i<=piv) i++;
for(j = 33; j>=0; j--)
if(a[i] & (1ll<<j)) break;
for(j=j; j>=0; j--) {
if(a[i]&(1ll<<j)) printf("1"); else printf("0");
}
//ll prev_i = i;
for(i++; i<piv; i++){
hbtPrtBin(a[i]);
}
//if(prev_i == i) continue;
// if(a[i] = 0){
// printf("0");
// continue;
// }
if(i>piv){continue;}
for(j = 31; j>=pos; j--){
if(a[i]&1ll<<j) printf("1"); else printf("0");
}
printf("\n");
}
//system("pause");
return 0;
}