[Jzoj] 1763.Gift

题目大意

给出 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 &lt; = 60 , i &lt; = 9223372036854775808 ) (a,b,c,d,e,f,g,h&lt;=60, i&lt;=9223372036854775808) (a,b,c,d,e,f,g,h<=60,i<=9223372036854775808)

题目解析

a − h a-h ah的值都为 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值