Little Boxes
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 2520 Accepted Submission(s): 907
Problem Description
Little boxes on the hillside.
Little boxes made of ticky-tacky.
Little boxes.
Little boxes.
Little boxes all the same.
There are a green boxes, and b pink boxes.
And c blue boxes and d yellow boxes.
And they are all made out of ticky-tacky.
And they all look just the same.
Input
The input has several test cases. The first line contains the integer t (1 ≤ t ≤ 10) which is the total number of test cases.
For each test case, a line contains four non-negative integers a, b, c and d where a, b, c, d ≤ 2^62, indicating the numbers of green boxes, pink boxes, blue boxes and yellow boxes.
Output
For each test case, output a line with the total number of boxes.
Sample Input
4 1 2 3 4 0 0 0 0 1 0 0 0 111 222 333 404
Sample Output
10 0 1 1070
Source
2017ACM/ICPC亚洲区沈阳站-重现赛(感谢东北大学)
问题链接:HDU6225 Little Boxes
问题简述:(略)
问题分析:
这个问题看似简单,其实有一个坑,就是输入的4个数都是2^62时,需要注意,变成了超过64位整数的大数,要有有效的方法来处理。
用Java的大数来解决,毫无悬念。
用128位整数类型和运算的程序居然也通过了,有点惊讶,也许许多编译器已经开始支持128位整数。
同时提供一个Python的程序,未验证。
程序说明:
程序中,2^62*4值是18446744073709551616,不用大数的话,需要事先算出来。现场比赛时,怎么算???需要事先想好应对之策。
题记:
UVALive8209与本题是同一个题,测试数据坑,无语。
参考链接:(略)
AC的C++语言程序如下:
/* HDU6225 Little Boxes */
#include <iostream>
#include <stdio.h>
using namespace std;
typedef unsigned long long ULL;
int main()
{
int t;
scanf("%d", &t);
while(t--) {
ULL a, b, c, d, maxv = ((ULL)1 << 62);
scanf("%llu%llu%llu%llu", &a, &b, &c, &d);
if(a == maxv && b == maxv && c == maxv && d == maxv)
printf("18446744073709551616\n"); // 4个2^62之和
else
printf("%llu\n", a + b + c + d);
}
return 0;
}
AC的C++语言程序(128位整数运算)如下:
/* HDU6225 Little Boxes */
#include <iostream>
#include <stdio.h>
using namespace std;
typedef unsigned long long ULL;
void myitoa(__int128_t v, char* s)
{
char temp;
int i=0, j;
while(v >0) {
s[i++] = v % 10 + '0';
v /= 10;
}
if(i == 0)
s[i++] = '0';
s[i] = '\0';
j=0;
i--;
while(j < i) {
temp = s[j];
s[j] = s[i];
s[i] = temp;
j++;
i--;
}
}
int main()
{
int t;
scanf("%d", &t);
while(t--) {
__uint128_t ans = 0;
char s[66];
ULL a, b, c, d;
scanf("%llu%llu%llu%llu", &a, &b, &c, &d);
ans += a;
ans += b;
ans += c;
ans += d;
myitoa(ans, s);
printf("%s\n", s);
}
return 0;
}
AC的Java语言程序如下:
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static Scanner s = new Scanner(System.in);
public static void main(String args[]) throws Exception {
Scanner in = new Scanner(System.in);
int t = in.nextInt();
while(t-- != 0) {
BigInteger a = in.nextBigInteger();
BigInteger b = in.nextBigInteger();
BigInteger c = in.nextBigInteger();
BigInteger d = in.nextBigInteger();
System.out.println(a.add(b.add(c.add(d))));
}
}
}
Python语言程序如下:
# HDU6225 UVALive8209 Little Boxes
n = int(input())
for i in range(0, n):
a,b,c,d = map(int, input().split())
print(a + b + c + d)