小A和小B是一对好朋友,他们的爱好是研究数字。学过除法之后,他们就发明了一个新游戏:两人各说一个数字分别为a和b,如果a能包含b的所有质数因子,那么A就获胜。但是当数字太大的时候,两个朋友的脑算速度就有点跟不上了。
现在,请你写个程序,来判断胜负吧:输入两个正整数,表示a和b(2≤a,
b≤10^18)。如果a包含了b的所有质数因子,则输出“Yes”,否则输出“No”(输出时没有引号)。
Input Data
输入两个正整数a和b,中间用一个空格隔开。
Output Data
如果a包含了b的所有质数因子,则输出“Yes”,否则输出“No”(输出时没有引号)。
Input / Output Sample
120 75
Yes
代码实现:
#include <cstdio>
long long gcd(long long m, long long n) //辗转相除法求最大公因数
{
if(m%n == 0) return n;
return gcd(n, m%n);
}
int main()
{
long long a, b, c; //10^18大于2^32,要使用long long
scanf("%lld%lld", &a, &b);
c = gcd(a, b);
while(c > 1) //一个数可分解为a = 1*.*.*.*.,找到a,b之间的公因子
{
b = b / c;
c = gcd(a, b);
}
if(b > 1) //得到一个a不含b的因子(非1),使c为1退出上述循环,b>1
printf("No\n");
else //得到最后b为1,b与a的公因子为1退出上述循环,即都包含
printf("Yes\n");
return 0;
}