jzoj1763. Gift

题目

Description

Input

输入的第一行为一个整数t。
  接下来t行,每行包含九个自然数。

Output

输出t行
  每行一个整数,表示2a+2b+2c+2d+2e+2f+2g+2h+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

分析

一开始一看觉得要打高精,但其实不用。。。

分析一下数据范围:如果开个unsigned long long (264-1),只有一个数据——当a=b=c=d=f=g=h=64且i=9223372036854775808时才会超1
所以只需要特判一下这个数据就行,不用高精和快速幂什么的

CODE

40分的高精 (TLE了)

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int t,a[100],b[100];

void work(){
	int k=0;
	for (int i=1;i<=50;i++){
		a[i]=b[i]+a[i]+k;
		k=a[i]/10;
		a[i]%=10;
	}
	return;
}

void work1(int x){
	while (x--){
		int k=0;
		for (int i=1;i<=50;i++){
			b[i]=b[i]*2+k;
			k=b[i]/10;
			b[i]=b[i]%10;
		}
	}
	work();
	return;
}

int main(){
	scanf("%d",&t);
	while (t--){
		memset(a,0,sizeof(a));
		for (int i=1;i<=8;i++){
			memset(b,0,sizeof(b));
			int n;
			scanf("%d",&n);
			if (n==0){
				b[1]=1;
				work();
			} 
				else{
					b[1]=2;
					work1(n-1);
				}
		}
		memset(b,0,sizeof(b));
		char s[100];
		scanf("%s",s);
		int l=strlen(s);
		for(int i=0;i<l;i++)
			b[l-i]=s[i]-'0';
		work();
		int m=50;
		while (a[m]==0) m--;
		for (int i=m;i>=1;i--){
			printf("%d",a[i]);
		}
		printf("\n");
	}
	return 0;
}

100分的特判

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm> 
using namespace std;

int t,a[10];
unsigned long long sum,n,m;

int main(){
	scanf("%d", &t);
	while (t--){
		sum=0;
		scanf("%d%d%d%d%d%d%d%d%llu",&a[1],&a[2],&a[3],&a[4],&a[5],&a[6],&a[7],&a[8],&m);
		if (a[1]==60 && a[2]==60 && a[3]==60 && a[4]==60 && a[5]==60 && a[6]==60 && a[7]==60 && a[8]==60 && m==9223372036854775808){
			printf("18446744073709551616\n");
			continue;
		}
		for (int i=1;i<=8;i++){
			n=1;
			while (a[i]--) n*=2;
			sum+=n;
		}
		sum+=m;
		printf("%llu\n",sum);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值