标题:机器人繁殖
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>, 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
思路 :仔细观察题目后你会发现题目和斐波那契数列很像
如果不发射机器人 :机器人数量变化是 x x+2x x+2x+4x x+2x+4x+8x …… (2^(n+1)-1)x
0年 1年 2年 3年 n年
也就是说当你知道机器人总数后 除以(2^(n+1)-1) 就能得到 初始的机器人数
要注意的是 给的机器人数量 是 每年发出一个新机器人后的数量 所以要求出 到底发出送了多少机器人 (注意:发出去的机器人也可以繁殖 这些数量同样要加上 )
听起来很麻烦 其实 就一个公式的事 应为是有规律的 :
第一年 发出的机器人变成了 2^(n)-1 个
第2年 发出的机器人变成了 2^(n-1)-1 个
第3年 发出的机器人变成了 2^(n-2)-1 个
……
第n-1年 发出的机器人变成了 2^2 - 1 个
第n年 发出的机器人变成了 2^1 -1 个
求一下和 就是 ( 2^(n+1)-1)-1-n ;(应为没有2^0 说以多加个 1 要减去)
化简一下就是 2^(n+1)-n-2;
# include <stdio.h>
# include <math.h>
int main(void)
{
int n;
double a,sum,c,b;//由于数据很大用 double 存储
scanf("%d %lf",&n,&sum);
c =pow(2,n+1)-n-2;//求每年送出去的机器人总数
a =(sum+c);//求出每年不把机器人发送到太空的 机器人总数
b=(pow(2,n+1)-1);//机器人的增长倍数 于年数有关 0年1倍 1年 3倍 2年 7倍 3年 15倍 4年 31倍 就是 2的(n+1)次方-1
printf("%d",(int)(a/b));//用总数除以增长倍数 初始机器人数
return 0;
}