Skip to main content
Original98 words1 min

题解:AT_nikkei2019ex_e コラッツ問題

Summary

考拉兹(Collatz)迭代的逆向构造。设 f(x) 为 x 按考拉兹规则(偶数除以 2,奇数乘 3 加 1)到达 1 所需的步数,给定目标步数 p,要求构造一个满足 f(x) 等于 p 的正整数 x。利用样例给出的 p 等于 1000 时的一个解 x 等于 1789997546303,按 p 每减小 1 对应一步迭代的关系,从该解倒推 1000 减 p 步即可得到答案。

解题思路​

设 p=f(x)p=f(x),则有:

p−1={f(x2)x mod 2=0f(3x+1)x mod 2=1p-1= \begin{cases} f\left(\frac{x}{2}\right) & x\bmod 2=0 \\ f(3x+1) & x\bmod 2=1 \end{cases}

样例 #2 给了 p=1000p=1000 的一个解 x=1789997546303x=1789997546303,根据结论倒推即可。

参考代码​

237 Bcpp
#include <bits/stdc++.h>
using namespace std;

using ll=long long;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int p;
cin>>p;
ll f=1789997546303;
for(int i=1000;i>p;i--)f=f&1?f*3+1:f>>1;
cout<<f<<'\n';
return 0;
}