90分求调,求大佬看看

P1072 [NOIP2009 提高组] Hankson 的趣味题

为什么要这么长? ```cpp #include<bits/stdc++.h> using namespace std; int gcd(int a,int b){ return !b?a:gcd(b,a%b); } int lcm(int a,int b){ return 1ll*a*b/gcd(a,b); } int main() { int t; cin >> t; while (t--) { int a0,a1,b0,b1,ans=0; cin >> a0 >> a1 >> b0 >> b1;//一定是b1的因数 for (int i=1;i*i<=b1;++i) { if (b1%i==0) { if (gcd(i,a0)==a1&&lcm(i,b0)==b1) { ans++; } int j=b1/i; if (gcd(j,a0)==a1&&lcm(j,b0)==b1&&j*j!=b1) { ans++; } } } cout << ans; puts(""); } }
by zzb1217 @ 2023-09-20 15:59:02


我们可以从样例里知道ans一定是b1的倍数,所以我们暴力是1~n求,但我们发现,只要1~sqrt(b1)就可以得到他的所有因子,在用因子判断即可
by zzb1217 @ 2023-09-20 16:01:06


@[zhouzibo1217](/user/746761) ```cpp #include <bits/stdc++.h> #define int long long using namespace std; signed main(){ ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); int _; cin >> _; while (_ --){ int A0; cin >> A0; int A1; cin >> A1; int B0; cin >> B0; int B1; cin >> B1; int tmp = B1 / B0; int ans = 0; for (int i = tmp; i <= B1; i += tmp){ if (__gcd(i, A0) == A1 && i * B0 / __gcd(i, B0) == B1){ ans ++; } } cout << ans << endl; } return 0; } ``` 这样为什么会T两个点啊
by Missdie @ 2023-10-25 21:09:37


|