[CoE R4 B/Stoi2041] 龙拳
题面
找规律
首先我们发现
同样地,当
这时候有趣的地方来了,
也就是说,当
发现了什么?
按照这个规律推下去,你会发现当
也就是
并且还会你发现
那输出
不过这里只是
其它情况可以分为两类:
-
不妨设 $n=2^ab$ 时,那么此时一定有 $f^{a}(n)=3^ab$。 那就变成了之前的情况了。 当然也可能提前就能让 $n$ 满足进行循环的条件,比如 $n=2,6,12$ 的答案都是 $0$。 这个不是很难推,只要让 $n=4\cdot3^xy$ 或者 $n=2\cdot3^xy$ 或者 $n=3^xy(x>0)$,都能直接进入循环。 最后答案是 $\max(a-2,0)$。 -
显然 $g(n)$ 也是奇数,那么 $f(n)=n+g(n)$ 一定是偶数。 那就变成了第一种情况了。 即答案为 $\max(a-2,0)+1$。
那我们只需要对于每一个
显然用欧拉素数筛可以提前预处理出来。
代码:
#include<bits/stdc++.h>
#define N 30000005
using namespace std;
vector <int> prime;
bool vis[N];int g[N];
int T,n,k;
int main(){
for(int i(2);i<N;++i){
if(!vis[i]){prime.push_back(i);g[i]=1;}
for(int j(0);j<prime.size()&&i*prime[j]<N;++j){
vis[i*prime[j]]=1;g[i*prime[j]]=i;
if(!(i%prime[j])) break;
}
}
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&k);
if(k%3) puts("-1");
else{
int cnt(0),flg(0);
if(n%2&&n%3) n=n+g[n],flg=1;
while(n&1^1) n>>=1,++cnt;
printf("%d\n",max(cnt-2,0)+flg);
}
}
return 0;
}