T1 loj 2589 Hankson的趣味题
题目大意:
给 a1 a2 b1 b2
求有多少个n满足 gcd(a1,n)=a2 lcm(b1,n)=b2
思路:
枚举b2的所有因数x
判断的时候判断x/a2与a1/a2是否互质 b2/x与b2/b1是否互质
只有都满足的时候才满足 正确性显然
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstdlib> 5 #include<cstring> 6 #include<algorithm> 7 #include<vector> 8 #include<queue> 9 #define inf 2139062143 10 #define ll long long 11 #define MAXN 1200 12 #define MOD 1000000000 13 using namespace std; 14 inline int read() 15 { 16 int x=0,f=1;char ch=getchar(); 17 while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} 18 while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();} 19 return x*f; 20 } 21 int T,a1,b1,a2,b2,ans,i; 22 inline int gcd(int a,int b) {return !b?a:gcd(b,a%b);} 23 inline int solve(int x) {if(x%a2) return 0;return gcd(x/a2,a1/a2)==1&&gcd(b2/x,b2/b1)==1;} 24 int main() 25 { 26 T=read(); 27 while(T--) 28 { 29 a1=read(),a2=read(),b1=read(),b2=read(),ans=0; 30 for(i=1;i*i<=b2;i++) 31 if(b2%i==0) ans+=solve(i)+solve(b2/i); 32 if((i-1)*(i-1)==b2) ans-=solve(i-1); 33 printf("%d\n",ans); 34 } 35 }