題意:
經典問題。
分析:
如果直接算,估計要TLE了,其實對於求n的循環長度,如果n是奇數那麼只需要知道3*n+1的循環長度,如果n是偶數那麼只需要知道n/2的循環長度,容易想到的是分治+記憶化
Code:
#include <set>
#include <map>
#include <cmath>
#include <ctime>
#include <stack>
#include <queue>
#include <deque>
#include <vector>
#include <cstdio>
#include <bitset>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
#define DIR 4
#define DIM 2
#define STATUS 2
#define MAXM 1000 + 10
#define MAXN 1000000 + 10
#define oo (~0u)>>1
#define INF 0x3F3F3F3F
#define REPI(i, s, e) for(int i = s; i <= e; i ++)
#define REPD(i, e, s) for(int i = e; i >= s; i --)
static const double EPS = 1e-5;
long long f[MAXN];
inline long long dp(long long x)
{
long long tmp = x;
long long cnt = 0L;
while( true ) {
if( tmp < MAXN && -1 != f[tmp] ) {
return f[tmp]+cnt;
}
if( tmp&1 ) {
tmp = tmp*3+1;
}
else {
tmp /= 2;
}
cnt += 1L;
}
return cnt;
}
int main(int argc, char const *argv[])
{
#ifndef ONLINE_JUDGE
freopen("test.in", "r", stdin);
#endif
long long l, r, rst;
memset(f, -1, sizeof(f));
f[1] = 1L;
while( ~scanf("%lld %lld", &l, &r) ) {
rst = 0L;
for(long long i = min(l, r); i <= max(l, r); i ++) {
rst = max(rst, dp(i));
}
printf("%lld %lld %lld\n", l, r, rst);
}
return 0;
}