luogu P1072 Hankson 的趣味题

传送门

日渐熟练了

从已知条件搞一搞就可以发现a1|x , x|b1

于是考虑枚举约数

O(sqrt(n)*lgn*T)差不多1e7 被ll卡一波常数

考试的时候实在卡常的话 也一定要看清楚 

该开longlong的不能少

Code:

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<queue>
 6 #include<vector>
 7 #include<iostream>
 8 #include<iomanip>
 9 #define itn int
10 #define ms(a,b) memset(a,b,sizeof a)
11 #define rep(i,a,n) for(int i = a;i <= n;i++)
12 #define per(i,n,a) for(int i = n;i >= a;i--)
13 #define inf 2147483647
14 using namespace std;
15 typedef long long ll;
16 ll read() {
17     ll as = 0,fu = 1;
18     char c = getchar();
19     while(c < '0' || c > '9') {
20         if(c == '-') fu = -1;
21         c = getchar();
22     }
23     while(c >= '0' && c <= '9') {
24         as = as * 10 + c - '0';
25         c = getchar();
26     }
27     return as * fu;
28 }
29 //head
30 int a1,b1,a2,b2; 
31 int gcd(int a,int b) {return b ? gcd(b,a%b) : a;}
32 
33 bool judge(int x) {
34     x *= a2;
35     if(gcd(x,a1) == a2 && (ll)b2 * gcd(x,b1) == (ll)x * b1) return 1;
36     return 0;
37 }
38 
39 void solve() {
40     int ans = 0;
41     a1 = read(),a2 = read(),b1 = read(),b2 = read();
42     int t = b2 / a2;
43     rep(i,1,sqrt(t)) {
44         if(t % i) continue;
45         ans += judge(i);
46         if(i * i == t) continue; 
47         ans += judge(t/i);
48     }
49     printf("%d\n",ans);
50 }
51 
52 int main() {
53     int T = read();
54     while(T--) solve();
55     return 0;
56 }

猜你喜欢

转载自www.cnblogs.com/yuyanjiaB/p/9928021.html
今日推荐