B1. Reverse Card (Easy Version)

https://codeforces.com/contest/1967/problem/B1

题意:给定n和m,求所有的有序对[a, b],1 <= a <= n, 1 <= b <= m,满足(a + b) % (b * gcd(a, b)) == 0

思路:放代码里了

总结:

//(a + b) % (b * gcd(a,b)) == 0,说明(a + b) % b == 0,得出a % b == 0
//如果a % b == 0,那么gcd(a, b)就是b
//所以原式化简为(a + b) % (b * b) == 0
//说明,如果a不加b,% b是有余数的,这个余数v 就是b * b - a % (b * b),并且这个v + b == b²,得出
//a % (b * b) = b²-b => (a % b²) == b² - b ==> a % b² ==> a == k * b² + (b² - b)

inline void solve() {
    long long n, m;
    cin >> n >> m;

    int ans = n;

    for (long long b = 2; b <= m; ++b) {
        auto now = ans;
        long long pow = b * b;
        long long c = b * (b - 1);
        if (c > n) {
            break;
        }
        ans += (n - c) / (pow);//看看当前的pow能在[1, n]内贡献多少个a出来
        ans ++; //当k为0时,c对应了一个定值a..
    // cout << "b , " << b << " ,now ans: " << ans - now << '\n';
        // for (int k = 0; k * pow + c <= n; ++k) {

        // }
    }

    cout << ans << '\n';
}
posted @ 2025-11-07 11:19  _Yxc  阅读(2)  评论(0)    收藏  举报