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