码迷,mamicode.com
首页 > 其他好文 > 详细

SDUT 1232-猴子分桃(逆推)

时间:2014-10-23 22:49:47      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:递推

猴子分桃

Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^

题目描述

老猴子辛苦了一辈子,给那群小猴子们留下了一笔巨大的财富——一大堆桃子。老猴子决定把这些桃子分给小猴子。

第一个猴子来了,它把桃子分成五堆,五堆一样多,但还多出一个。它把剩下的一个留给老猴子,自己拿走其中的一堆。

第二个猴子来了,它把桃子分成五堆,五堆一样多,但又多出一个。它把多出的一个留给老猴子,自己拿走其中的一堆。 
后来的小猴子都如此照办。最后剩下的桃子全部留给老猴子。 

这里有n只小猴子,请你写个程序计算一下在开始时至少有多少个桃子,以及最后老猴子最少能得到几个桃子。

输入

输入包括多组测试数据。
每组测试数据包括一个整数n(1≤n≤20)。 
输入以0结束,该行不做处理。

输出

每组测试数据对应一行输出。
包括两个整数a,b。 
分别代表开始时最小需要的桃子数,和结束后老猴子最少能得到的桃子数。

示例输入

5
1
0

示例输出

3121 1025
1 1
设最开始有x个桃子,可以知道 x%5==1 所以我们可以往初始桃子堆中加入4个桃子,那么(x+4)/5 (一定可以整除)就代表第一个猴子拿走的那一堆加上老猴的那一个。然后剩下了(x+4)*(4/5),这时仍然是上面那种多4个桃子的情况,然后第二个猴子拿,最终第n个猴子拿完,剩余的桃子为 (x+4)*(4/5)^n,这个数要满足是整数且x尽量小,所以 x+4==5^n;得 x==5^n-4;
然后上述剩余的桃子加上每次老猴都留下的那个桃子(共n个)然后在减去最开始加的4个桃子,即为老猴剩余的桃子:4^n+n-4;
 
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cctype>
#include <cmath>
#include <cstdlib>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <list>
#define ll long long
using namespace std;
const int INF = 0x3f3f3f3f;
int main()
{
	int n;
	while(~scanf("%d",&n)&&n)
	{
		ll x=pow(5,n)-4;
		ll lef=pow(4,n)+n-4;
		printf("%lld %lld\n",x,lef);
	}
	return 0;
}

SDUT 1232-猴子分桃(逆推)

标签:递推

原文地址:http://blog.csdn.net/qq_16255321/article/details/40403781

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!