自己翻译
如果想不出正解的话可以直接搜索,BFS也能过,但写起来太麻烦
数论做法:
如果能达到要求的话,最后一定要吃成a,b的最大公约数
那就一口一口的吃,先吃1/2,再吃2/3,再吃4/5,如果最后吃不成一样的,就无法完成,如果可以,就输出所有动作的和,即
cout<
完整代码(bfs版)
#include#include #include #include using namespace std;struct zhw{ int a; int b; int tot;};int cnt=123456789,flag;void bfs(int a,int b){ queue q; zhw que; que.a=a; que.b=b; que.tot=0; q.push(que); while(!q.empty()) { que=q.front(); q.pop(); if(que.a==que.b) { cnt=que.tot; flag=1; } if(que.a>que.b) { if(que.a%2==0) { zhw Tot; T.a=que.a/2; T.b=que.b; T.tot=que.tot+1; q.push(T); } if(que.a%3==0) { zhw Tot; T.a=que.a/3; T.b=que.b; T.tot=que.tot+1; q.push(T); } if(que.a%5==0) { zhw T; T.a=que.a/5; T.b=que.b; T.tot=que.tot+1; q.push(T); } } if(que.a >x>>y; bfs(x,y); if(flag==0) printf("-1"); else printf("%d",cnt); return 0;}
数论版
#include#include using namespace std;int pw(int &a,int b){ int t=0; while(a%b==0) { a=a/b; t++; } return t;}int gcd(int m,int n){ if(n==0) return m; else return gcd(n,m%n);}int main(){ int p2[2],p3[2],p5[2]; int a,b; int z; cin>>a>>b; z=gcd(a,b); a=a/z,b=b/z; p2[0]=pw(a,2); p2[1]=pw(b,2); p3[0]=pw(a,3); p3[1]=pw(b,3); p5[0]=pw(a,5); p5[1]=pw(b,5); if(a!=b) { cout<<"-1"; return 0; } else cout<