CF2114F
题解
注意到最好的方案是将
证:若转化到低于
然后设
可以看作将
发现如果
其余情况皆有解,用记忆化搜索即可。
用 memset 炸了,考试慎用 memset。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+5;
int _;
ll x,y,k;
ll f[N];
inline ll dfs(ll x) {
if(x==1) return 0;
if(x<=k) return 1;
if(f[x]!=-1) return f[x];
for(int i=k;i>1;i--) {
if(x%i==0) {
ll nxt=dfs(x/i);
if(nxt==-1) continue;
if(f[x]==-1) f[x]=nxt+1ll;
else f[x]=min(f[x],nxt+1ll);
}
}
return f[x];
}
inline ll gcd(ll a,ll b) {
if(!b) return a;
return gcd(b,a%b);
}
int main() {
scanf("%d",&_);
while(_--) {
scanf("%lld%lld%lld",&x,&y,&k);
ll g=gcd(x,y);
ll a=x/g,b=y/g;
for(int i=1;i<=max(a,b);i++) f[i]=-1;
if(dfs(a)==-1||dfs(b)==-1) puts("-1");
else printf("%lld\n",dfs(a)+dfs(b));
}
return 0;
}