1 条题解

  • 0
    @ 2024-8-12 19:32:39

    题目挺唬人的,就是让你找到有多少个数是既能整除 aa,也能整除 bb

    显然的:我们可以确定答案的最大值,就是它们的最大公因数。

    接下来就直接枚举,从 11gcd(a,b)\gcd(a,b) 看每个 ii 是否满足条件,这样会超时,因为 gcd(a,b)\gcd(a,b) 可能很大。

    t=gcd(a,b)t=\gcd(a,b)

    所以我们需要优化这个过程,枚举到 t\sqrt t 我们每次找两个,一个是小的因数,一个是大的因数(当 itii \neq \cfrac ti),这样可以把时间降低到 t\sqrt t

    时间复杂度 O(t)O(\sqrt{t})

    #include <bits/stdc++.h>
    
    using u32 = unsigned;
    using i64 = long long;
    using u64 = unsigned long long;
    using i128 = __int128;
    
    void solve() {
    	int a, b;
    	std::cin >> a >> b;
    	int t = std::gcd(a, b);
    	int ans = 0;
    	for (int i = 1; i * i <= t; i++) {
    		if (t % i == 0) {
    			if (i != t / i) {
    				ans += 2;
    			} else {
    				ans ++;
    			}
    		}
    	}
    	std::cout << ans << '\n';
    }
    
    int main() {
    	std::ios::sync_with_stdio(false);
    	std::cin.tie(nullptr);
    
    	int t; 
    	std::cin >> t;
    	while (t --) {
    		solve();
    	}
    
    	return 0;
    }
    
    • 1

    信息

    ID
    50
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    107
    已通过
    20
    上传者