hdu 4497 GCD and LCM

时间:2023-03-09 00:54:02
hdu 4497 GCD and LCM

思路:易知L不能整除G时为0;

将L/G质因数分解,对于其中的因子p,个数为cnt,则至少有一个包含p^cnt,至少有一个数不包含p;

只有一个数包含p^cnt时,有C(3,1);

有2个数包含p^cnt时,有C(3,1);

有2个数包含p因子,其中一个是p^cnt,另外一个有cnt-1种,总共有(cnt-1)A(3,2).

所以总共有6*cnt。

代码如下:

 #include<iostream>
#include<stdio.h>
#include<algorithm>
#include<iomanip>
#include<cmath>
#include<cstring>
#include<vector>
#define ll __int64
#define pi acos(-1.0)
#define MAX 50000
using namespace std;
int prime[MAX],cnt,e[MAX],lena;
bool f[MAX];
void init()
{
int i,j;
cnt=;
for(i=;i<MAX;i++){
if(f[i]==) prime[cnt++]=i;
for(j=;j<cnt&&i*prime[j]<MAX;j++){
f[i*prime[j]]=;
if(i%prime[j]==) break;
}
}
}
int solve(int n)
{
int i,j=,ans=;
for(i=;i<cnt&&prime[i]*prime[i]<=n;i++){
if(n%prime[i]==){
e[j]=;
n/=prime[i];
while(n%prime[i]==){
e[j]++;
n/=prime[i];
}
j++;
}
}
if(n>){
e[j++]=;
}
for(i=;i<j;i++){
ans*=*e[i];
}
return ans;
}
int main(){
int i,t,n,a,b,j,ans;
init();
scanf("%d",&t);
while(t--){
scanf("%d%d",&a,&b);
if(b%a) printf("0\n");
else printf("%d\n",solve(b/a));
}
return ;
}