Half of and a Half
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 735 Accepted Submission(s): 319
Total Submission(s): 735 Accepted Submission(s): 319
Problem Description
Gardon bought many many chocolates from the A Chocolate Market (ACM). When he was on the way to meet Angel, he met Speakless by accident.
"Ah, so many delicious chocolates! I'll get half of them and a half!" Speakless said.
Gardon went on his way, but soon he met YZG1984 by accident....
"Ah, so many delicious chocolates! I'll get half of them and a half!" YZG1984 said.
Gardon went on his way, but soon he met Doramon by accident....
"Ah, so many delicious chocolates! I'll get half of them and a half!" Doramon said.
Gardon went on his way, but soon he met JGShining by accident....
"Ah, so many delicious chocolates! I'll get half of them and a half!" JGShining said.
.
.
.
After had had met N people , Gardon finally met Angel. He gave her half of the rest and a half, then Gardon have none for himself. Could you tell how many chocolates did he bought from ACM?
"Ah, so many delicious chocolates! I'll get half of them and a half!" Speakless said.
Gardon went on his way, but soon he met YZG1984 by accident....
"Ah, so many delicious chocolates! I'll get half of them and a half!" YZG1984 said.
Gardon went on his way, but soon he met Doramon by accident....
"Ah, so many delicious chocolates! I'll get half of them and a half!" Doramon said.
Gardon went on his way, but soon he met JGShining by accident....
"Ah, so many delicious chocolates! I'll get half of them and a half!" JGShining said.
.
.
.
After had had met N people , Gardon finally met Angel. He gave her half of the rest and a half, then Gardon have none for himself. Could you tell how many chocolates did he bought from ACM?
Input
Input contains many test cases.
Each case have a integer N, represents the number of people Gardon met except Angel. N will never exceed 1000;
Each case have a integer N, represents the number of people Gardon met except Angel. N will never exceed 1000;
Output
For every N inputed, tell how many chocolates Gardon had at first.
Sample Input
2
Sample Output
7
——————————————————————————————————————————
每次减去所有的一半以及一个的一半,可以归纳为Sn = a0+a1+...+an(an = 2^n),由于数据量为1000,即2^1000,需要用高精度计算的方法,先对大数进行分块处理,然后再合并起来,在输出时需要考虑中间数据块如果小于10000,需要在前面补零通过控制符"%04d"来输出
/****************************
*Name:Half of and a Half.c
*Tags:ACM water
*Note:题目思路:每次减去所有的一半以及一个的一半,可以归纳为Sn = a0+a1+...+an(an = 2^n),由于数据量为1000,即2^1000,需要用高精度计算的方法,先对大数进行分块处理,然后再合并起来,在输出时需要考虑中间数据块如果小于10000,需要在前面补零通过控制符"%04d"来输出
****************************/
#include <stdio.h>
int main()
{
int num[1002][500], res[500];
int n, i, j, c;
for(i = 0; i < 1002; i++) {
for(j = 0; j < 500; j++) {
num[i][j] = 0;
}
} //初始化
num[0][1] = 1;
num[0][0] = 1; // 记录数据块数
for(i = 1; i < 1002; i++) {
num[i][0] = num[i-1][0];
for(j = 1; j <= num[i-1][0]; j++) {
num[i][j] += num[i-1][j]*2;
while(num[i][j] >= 10000) {
if(j+1 > num[i][0]) {
num[i][0] = j+1;
}
num[i][j+1] = num[i][j]/10000;
num[i][j] %= 10000;
}
}
} //预处理
while(scanf("%d", &n) != EOF) {
res[0] = num[n][0];
for(i = 1; i < 500; i++) {
res[i] = 0;
}
for(i = 0; i <= n; i++) {
for(j = 1; j <= num[i][0]; j++) {
res[j] += num[i][j];
while(res[j] >= 10000) {
if(j+1 > res[0]) {
res[0] = j+1;
}
res[j+1] += (res[j]/10000);
res[j] %= 10000;
}
}
}
printf("%d", res[res[0]]);
for(i = res[0]-1; i > 0; i--) {
printf("%04d", res[i]);
}
printf("\n");
}
return 0;
}