题目:机器人繁殖
X星系的机器人可以自动复制自己。
它们用1年的时间可以复制出2个自己,然后就失去复制能力。
每年X星系都会选出1个新出生的机器人发往太空。
也就是说,如果X星系原有机器人5个,
1年后总数是:5 + 9 = 14
2年后总数是:5 + 9 + 17 = 31
如果已经探测经过n年后的机器人总数s,你能算出最初有多少机器人吗?
数据格式:
输入一行两个数字n和s,用空格分开,含义如上。n不大于100,s位数不超过50位。
要求输出一行,一个整数,表示最初有机器人多少个。
例如:
用户输入:
2 31
则程序应该输出:
5
再例如:
用户输入:
97 2218388550399401452619230609499
则程序应该输出:
8
资源约定:
峰值内存消耗 < 512M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>,
不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
C++代码一:
#include <iostream>
#include <cmath>
using namespace std;
int main() {
long long s, m, t, n, i, d;
cin >> n >> s;
// 测试数据
// n = 2, s = 31; // out:5
// n = 3, s = 244; // out:17
// n = 5, s = 1203; // out:20
// n = 25, s = 1476395012; // out:23
// n = 42, s = 87960930222113; // out:11
// n = 85, s = 2398508826115424282617053239; // out:32
// n = 97, s = 2218388550399401452619230609499; // out:8
for(i = 0; i < s; i++) {
m = i;
t = i;
for(d = 1; d <= n; d++) {
t = t*2-1;
m += t;
}
if(fabs(s-m) < 0.4) {
cout << i;
return 0;
}
}
return 0;
}
Java代码一:
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
double s, m, t, n, i, d;
Scanner scanner = new Scanner(System.in);
n = Long.valueOf(scanner.next());
s = Long.valueOf(scanner.next());
// 测试数据
// n = 2; s = 31; // out:5
// n = 3; s = 244; // out:17
// n = 5; s = 1203; // out:20
// n = 25; s = 1476395012; // out:23
// n = 42; s = 87960930222113D; // out:11
// n = 85; s = 2398508826115424282617053239D; // out:32
// n = 97; s = 2218388550399401452619230609499D; // out:8
for(i = 0; i < s; i++) {
m = i;
t = i;
for(d = 1; d <= n; d++) {
t = t*2-1;
m += t;
}
if(Math.abs(s-m) < 0.4) {
System.out.println((int) i);
return ;
}
}
return ;
}
}