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; }