【数据类型范围】gift

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,所以结果的最大值刚好超了一个。

那么,为什么不把这一个特殊情况列出来呢?

扫描二维码关注公众号,回复: 1730753 查看本文章

那么,这个问题就很容易解决了。

考察点:对数据类型范围的了解


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

猜你喜欢

转载自blog.csdn.net/drtlstf/article/details/80718009
今日推荐