【TIMEGate】
https://www.luogu.org/problem/P1072
【解题思路】
一道TG T2不知为何这么水
按照题目的核心意思枚举gcd和lcm
略微优化一下做一个小处理
就是在循环判断i的时候,只需要循环到sqrt(b1)就可以了,每次判断i和b1/i
【code】
1 #include <cstdio>
2 #include <cmath>
3 #include <iostream>
4 #include <algorithm>
5 using namespace std;
6 int n,ans;
7 int a0,a1,b0,b1;
8 inline int read(){
9 char ch=getchar();
10 int x=0,f=1;
11 while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
12 while(ch>='0'&&ch<='9'){
13 x=(x<<1)+(x<<3)+ch-'0';
14 ch=getchar();
15 }
16 return x*f;
17 }
18 inline int gcd(int a,int b){
19 if(b==0)return a;
20 return gcd(b,a%b);
21 }
22 inline int lcm(int a,int b){
23 return (long long)a*b/gcd(a,b);
24 }
25 int main(){
26 scanf("%d",&n);
27 while(n--){
28 ans=0;
29 scanf("%d %d %d %d",&a0,&a1,&b0,&b1);
30 for(register int i=1;i<=sqrt(b1);i++){
31 if(b1%i==0){
32 if(gcd(i,a0)==a1 && lcm(i,b0)==b1)
33 ans++;
34 if(b1!=i*i)
35 if(gcd(b1/i,a0)==a1 && lcm(b1/i,b0)==b1)//优化
36 ans++;
37 }
38 }
39 printf("%d\n",ans);
40 }
41 return 0;
42 }