题目描述
X 星系的机器人可以自动复制自己。它们用 1 年的时间可以复制出 2 个自己,然后就失去复制能力。
每年 X 星系都会选出 1 个新出生的机器人发往太空。也就是说,如果 X 星系原有机器人 5 个,1 年后总数是:5 + 9 = 14,2 年后总数是:5 + 9 + 17 = 31。
如果已经探测经过 n 年后的机器人总数 s ,你能算出最初有多少机器人吗?
输入描述
输入一行两个数字 n 和 s,用空格分开,含义如上。n 不大于 100,s 位数不超过 50 位。
输出描述
要求输出一行,一个整数,表示最初有机器人多少个。
输入输出样例
示例 1
输入
2 31
输出
5
示例 2
输入
97 2218388550399401452619230609499
输出
8
运行限制
- 最大运行时间:1s
- 最大运行内存: 512M
总通过次数: 803 | 总提交次数: 958 | 通过率: 83.8%
难度: 困难 标签: 2015, 模拟, 国赛
代码:
#include <stdio.h>
#define max 1000 // 定义一个常量max为1000,虽然在代码中未使用
int main()
{
double n, s; // n表示输入的次数,s表示初始值
double i, sum, num, aum, bum, yes;
// 使用while循环读取输入,当输入结束(EOF)时循环终止
while (scanf("%lf %lf", &n, &s) != EOF)
{
// 初始化变量
sum = 0; // sum用于保存阶段性计算结果
aum = 0; // aum用于累加sum的结果
num = 1; // num用于保存指数增长的值
bum = 1; // bum用于累加num的结果
// 循环n次进行计算
for (i = 0; i < n; i++)
{
// 计算sum:每次循环sum翻倍加1
sum = sum * 2 + 1;
// 累加sum到aum
aum = aum + sum;
// num翻倍
num = num * 2;
// 累加num到bum
bum = bum + num;
}
// 计算最终结果yes,即(s + aum) / bum
yes = (s + aum) / bum;
// 输出结果,保留小数点后0位
printf("%.0lf\n", yes);
}
return 0;
}