hdu 4497 最大公约数和最小公倍数

来源:互联网 发布:云计算的虚拟化技术 编辑:程序博客网 时间:2024/05/17 03:01

今天做2013ACM-ICPC 吉林通化的题,结果是很差,以前每次做完钢牛都会说他自己越来越了,而我只是想说,我似乎一直都是这么弱,比赛的时候看到了这题求最大公约数和最小公倍数,分析了一半然后觉得可麻烦,其实还是自己的思路不成熟,然后就在那里动想一下西想一下,每次都是思路走了一半之后自己就停车了,结果一下午就做了一题,似乎最简单的第一题也是wa了无数次没有AC的。

思路:对于n和m,如果m%n!=0,那么肯定是不存在的。

然后对于x=m/n进行分析,对与x进行质因数分解,假设其中的一个质因数为y,起指数为t,那么要使的三个数关于质因数y的最小公倍数为1最大公约数为y^t,那么三个数中关于y的指数一定的存在0和t,分情况讨论,如果三个数不同,则有6*(-1)种情况,还有的就是两个相同的,那么有六种情况,总共有6*t种情况,注意要用long long

#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<cmath>#include<algorithm>#include<queue>#include<stack>#include<vector>#include<climits>#include<map>using namespace std;#define rep(i,n) for(int i=0; i<n; i++)#define repf(i,n,m) for(int i=(n); i<=(m); ++i)#define repd(i,n,m) for(int i=(n); i>=(m); --i) #define ll long long#define arc(a) ((a)*(a))#define inf 100000#define exp 0.000001#define N 400000 ll n,m;ll a[N];ll ans;ll fun(ll x){ll sum=1;ll i=2;ll l=0;memset(a,0,sizeof(a));while(i<=x){if(x%i==0)a[l++]=1,x/=i;while(x%i==0)a[l-1]++,x/=i;++i;}rep(i,l)      sum*=a[i]*6;return sum;}int main(){ int test;scanf("%d",&test);while(test--){cin>>n>>m;if(m%n!=0){printf("0\n"); continue;}ll x=m/n;ans=fun(x);cout<<ans<<endl;}   return 0;}  


原创粉丝点击