CF1967B2. Reverse Card (Hard Version) 题解 数学题

题目链接:https://codeforces.com/problemset/problem/1967/B2

题目大意:

给你两个整数 nm,有满足如下条件的有序整数对 (a,b) 一共有多少个:

  • 1an1bm
  • bgcd(a,b)a+b 的倍数。

解题思路:

gcd(a,b)=ka=Akb=Bk

(A+B)k | Bkk

两边同时除以 k,得:

(A+B) | Bk

又因为 gcd(A,B)=1,得 gcd(A+B,B)=1(即 (A+B)B 互质),所以

(A+B) | k

所以 A<kB<k.

又因为

a=Akn,所以 knA

所以 A<knAA2<n

b=Bkm,所以 kmB

所以 B<kmBB2<m

所以可以 O(nmlognm) 的时间复杂度枚举互质的数对 (A,B)(多出来的 log 是求 gcd),

然后 k 能够取的数最大是 min(nA,mB)

又因为 (A+B) | k

所以满足条件的 k 的取值有 min(nA,mB)A+B 种可能。

示例程序:

#include <bits/stdc++.h>
using namespace std;

int T, n, m;

long long cal(int n, int m) {
    long long res = 0;
    for (int A = 1; A * A < n; A++) {
        for (int B = 1; B * B < m; B++) {
            if (__gcd(A, B) > 1) continue;
            res += min(n/A, m/B) / (A+B);
        }
    }
    return res;
}

int main() {
    scanf("%d", &T);
    while (T--) {
        scanf("%d%d", &n, &m);
        printf("%lld\n", cal(n, m));
    }
    return 0;
}
posted @   quanjun  阅读(4)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
历史上的今天:
2019-11-24 洛谷训练新手村之“简单字符串”题解
2019-11-24 洛谷训练新手村之“数组”题解
2019-11-24 洛谷训练新手村之“循环!循环!循环!”题解
2019-11-24 洛谷训练新手村之“顺序与分支”题解
2019-11-24 洛谷训练新手村之“洛谷的第一个任务”题解
点击右上角即可分享
微信分享提示