题目大意
给出 T T T组数据,每组数据 9 9 9个非负整数,分别为 a , b , c , d , e , f , g , j , i a,b,c,d,e,f,g,j,i a,b,c,d,e,f,g,j,i
求
2
a
+
2
b
+
2
c
+
2
d
+
2
e
+
2
f
+
2
g
+
2
h
+
i
2^a+2^b+2^c+2^d+2^e+2^f+2^g+2^h+i
2a+2b+2c+2d+2e+2f+2g+2h+i的值.
(
a
,
b
,
c
,
d
,
e
,
f
,
g
,
h
<
=
60
,
i
<
=
9223372036854775808
)
(a,b,c,d,e,f,g,h<=60, i<=9223372036854775808)
(a,b,c,d,e,f,g,h<=60,i<=9223372036854775808)
题目解析
若
a
−
h
a-h
a−h的值都为
60
60
60时,
8
8
8个数相加等于
9223372036854775808
=
M
a
x
i
9223372036854775808=Maxi
9223372036854775808=Maxi
且都比
l
o
n
g
long
long
l
o
n
g
long
long要大1。因此可以老老实实地用高精度,并用
u
n
s
i
g
n
e
d
unsigned
unsigned
l
o
n
g
long
long
l
o
n
g
long
long来读入即可
当然,也可以特判一下,直接输出答案
代码
#include<bits/stdc++.h>
#define LL long long
using namespace std;
int T,x,a[20],b[20];
LL p[70];
unsigned LL k,s;
int main()
{
p[0]=1;
for(int i=1;i<=60;i++) p[i]=p[i-1]*2;
cin>>T;
while(T--)
{
s=0;
for(int i=1;i<=8;i++) scanf("%d",&x),s+=p[x];
cin>>k;
memset(a,0,sizeof(a));memset(b,0,sizeof(b));
for(int cnt=0;s;s/=10) a[cnt++]=s%10;
for(int cnt=0;k;k/=10) b[cnt++]=k%10;
for(int i=0,ys=0;i<20;i++)
{
a[i]+=b[i]+ys;
ys=a[i]/10;
a[i]%=10;
}
int be=19;
while(a[be]==0) be--;
for(;be>=0;be--) cout<<a[be];
cout<<endl;
}
return 0;
}