题解:P11310 无穷的迭代器

stringdp100005

2025-01-16 12:10:36

题解

解题思路

k\bmod2=1 时,在一次操作后为 k(k+\dfrac{1}{2})=2k+1,显然为整数。
k\bmod2=0 时,\lceil r \rceil r=(k+\dfrac{1}{2})(k+1)=k^2+\dfrac{3}{2}k+\dfrac{1}{2}
k^2+k 显然为整数。故只用考虑 \dfrac{1}{2}k+\dfrac{1}{2} 是否为整数。
k=2k',则 \dfrac{1}{2}k+\dfrac{1}{2}=k'+\dfrac{1}{2}

又因 $k'=\dfrac{1}{2}k$,所以使得 $k'\bmod2=1$ 的次数为 $k$ 的二进制末尾 $0$ 的个数。 最终答案在此基础上加 $1$ 即可。 注意特判 $k=0$ 的情况,当 $k=0$ 时,无论如何操作,$r$ 都为 $\dfrac{1}{2}$。 # AC 代码 ```cpp #include<bits/stdc++.h> #define int long long #define lowbit(x) (x)&(-(x)) //使用 lowbit 求二进制末尾 0 的个数。 //k 末尾 0 的个数为 log2(lowbit(k))。 using namespace std; int t,k; signed main(){ cin>>t; while(t--){ cin>>k; if(k) cout<<log2(lowbit(k))+1<<endl;//当 k 不为 0 时的情况(别忘了 +1)。 else cout<<"NO!"<<endl;//当 k=0 时直接输出 NO。 } return 0; } ```