2016西电校赛网络赛Problem B 猴子吃桃 II
2019-04-13 21:04 发布
生成海报
Problem B
猴子吃桃 II
问题
现有 n 个桃子,无限可列个小猴子去领桃子吃。在桃子足够的情况下,排
在第 i 位的小猴子领 F (i) 个桃子,这里 F 是 Fibonacci 数列。若轮到第 i 个小
猴子时,剩余的桃子不到 F (i) 个,它就获得所有剩余的桃子,第 i + 1 个及以后
的小猴子就要挨饿了。
万神希望某只小猴子能拿到最多的桃子,那么这只猴子应该排在第几个位
置,又能吃到几个桃子呢?
Fibonacci 数列的定义见 http://oeis.org/A000045 。
输入格式
输入包含多组数据(最多 100 组),请处理到文件结束。
每组数据只有 1 行,包含正整数 n,表示桃子的总个数。
保证 1 ≤ n ≤ 10 18 。
输出格式
对于每组数据输出 1 行,包含两个整数,用空格分割。第一个整数表示小猴
子应该排在第几个位置,第二个整数表示小猴子能吃到几个桃子。
若排在两个位置能吃到的桃子数相同,则输出靠前的位置。
输入样例
1
20
输出样例
1 1
6 8
HINT
请正确使用 64 位整数,详见选手须知。
也没啥说的
#include
#include
#include
#include
#include
#define LL long long
using namespace std ;
const int N = 100 ;
LL sum[N];
void init()
{
sum[0 ] = 0 ;
sum[1 ] = 1 ;
sum[2 ] = 1 ;
for (int i = 3 ; i < N; i++)
{
sum[i] = sum[i-1 ] + sum[i-2 ];
}
}
int main()
{
init();
LL n;
while (~scanf ("%lld" , &n))
{
if (n == 3 || n == 2 || n == 1 )
{
printf ("1 1
" );
continue ;
}
LL t = n, left, ans, left_pre;
for (int i = 1 ; i < N; i++)
{
if (t > sum[i])
{
t-=sum[i];
continue ;
}
else {
left = t;
left_pre = sum[i-1 ];
ans = i;
break ;
}
}
if (left > left_pre)
{
printf ("%lld %lld
" , ans, left);
}
else {
printf ("%lld %lld
" , ans - 1 , left_pre);
}
}
return 0 ;
}
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮