Input
输入的第一行为一个整数t。 接下来t行,每行包含九个自然数a,b,c,d,e,f,g,h,i。
Output
输出t行,每行一个整数,表示2^a+2^b+2^c+2^d+2^e+2^f+2^g+2^h+i。
Sample Input
1 21 30 0 0 0 0 0 0 2147483647
Sample Output
3223322629
HINT
40% t<=1000
100% t<=100000 a,b,c,d,e,f,g,h<=60 i<=9223372036854775808
<分析>
刚看到这题的时候,大家都以为是恐怖的高精度。
有些大佬甚至把矩阵快速幂给搬出来了。
其实,这题并没有想象中的那么难。
既然a-h皆≤60,所以2^a+2^b+...+2^h的和≤2^63。
而i≤2^63,所以结果≤2^64。
而unsigned long long int的最大值是2^64-1,所以结果的最大值刚好超了一个。
那么,为什么不把这一个特殊情况列出来呢?
那么,这个问题就很容易解决了。
考察点:对数据类型范围的了解
#include <cstdio>
#define MAXUNSIGNEDLONGLONGINT 9223372036854775808
using namespace std;
int main(int argc, char** argv)
{
int t, a, i;
unsigned long long res, temp;
bool flag;
scanf("%d", &t);
while (t--)
{
res = 0;
flag = true;
for (i = 0; i < 8; i++)
{
temp = 1;
scanf("%d", &a);
if (a != 60)
{
flag = false;
}
while (a--)
{
temp *= 2;
}
res += temp;
}
scanf("%llu", &temp);
if ((flag) && (temp == MAXUNSIGNEDLONGLONGINT)) // 特殊情况,输出2^64
{
printf("18446744073709551616\n");
continue;
}
res += temp;
printf("%llu\n", res);
}
return 0;
}