Time Limit:1000ms
Memory Limit:65535K
Description
角谷猜想是指对于每一个正整数,
如果它是奇数,则对它乘 3 再加1 ,
如果它是偶数,则对它除以2 ,
如此循环,最终都能够得到1 。
小蓝了解到,对于小于1000000000 的数字,我们总可以在 1000 步以内的得到 。
现在他想知道, 【l,r】区间的数中哪个数得到 1 的步骤最大。
Input
输入包含一行,共两个整数 l 和r ,
表示小蓝想查询的区间。
Output
输出一行,包含一个整数, [l,r]区间的数中得到1 的步骤最大的那个数。
如果存在多个步骤最大的数,那么输出最小的那个。
Samples
Input 1
1 10
Output 1
9
Input 2
999999900 1000000000
Output 2
999999906
Hint
Solution
这数据范围页太友好了,R-L <= 1e4
,还有描述中提到的:
“对于小于1000000000 的数字,我们总可以在 1000 步以内的得到”
然后就可以愉快的暴力出奇迹了~
Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll gcnt(ll num)
{
ll cnt=0;
while(num!=1)
{
if(num%2)
{
num=num*3+1;
cnt++;
}
num/=2;
cnt++;
}
return cnt;
}
int main()
{
ll l,r,ans=-1,cnt=-1;
cin>>l>>r;
for(ll i=l;i<=r;i++)
{
ll cur=gcnt(i);
if(cur>cnt)
{
cnt=cur;
ans=i;
}
}
cout<<ans;
return 0;
}