题解:P12869 [蓝桥杯 2025 国 Python A] 特殊整数对的数量
鉴于这里是洛谷并且本题为 Python 组题目,本题解同时提供 C++ 和 Python 语言的代码。
- Q:提交答案题与传统题的区别是什么?
- A:传统题的时间限制是 \(1\) 秒,而提交答案题的时间限制是整场比赛时长!
因此不必像传统题一样追求极致的效率,只需编写出一个能在合理时间内求出答案的程序即可。
我们可以枚举所有 \(a\) 的值,忽略 \(a\perp b\) 的要求,先只考虑 \(b\) 的范围以及 \(2025\mid(a+b)\) 的要求。设 \(a\bmod 2025=m\),则 \(b\bmod 2025\) 必须等于 \((2025-m)\bmod 2025\),据此可以求出最小的 \(b\) 为 \(b_{\min}=a+(2025-2a\bmod 2025)\),所有可能的 \(b\) 值满足 \(b=b_{\min}+2025k\)(其中 \(k\in\N\))。
设 \(N=10^6,M=2025\),可以估算需要枚举的 \((a,b)\) 对数大约为 \(\frac{N^2}{2M}\approx 246913580\)。事实上,写一个程序验证发现准确数值为 \(246913304\)。
我们可以断言该数值乘以求 gcd 带来的 \(\log N\) 后所需的计算时间仍在合理范围内。依照上述代码逻辑,可以编写出以下程序:
C++ 程序(我的电脑上运行时间约为 \(8\sim 9\) 秒)
#include <bits/stdc++.h>
using namespace std;
int main() {
    int ans = 0;
    for(int a = 1; a <= 1000000; ++a) {
        for(int b = a + (2025 - 2 * a % 2025); b <= 1000000; b += 2025) {
            if(__gcd(a, b) == 1) ++ans;
        }
    }
    cout << ans << endl;
    return 0;
}
Python 程序(我的电脑上运行时间约为 \(35\sim 36\) 秒)
import math
ans = 0
for a in range(1, 1000001):
    for b in range(a + (2025 - 2 * a % 2025), 1000001, 2025):
        if math.gcd(a, b) == 1:
            ans += 1
print(ans)
在不到一分钟的时间内,我们得到了答案 \(93816892\),使用对应的语言输出这个数即可。

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号