记录编号 606447 评测结果 AAAAAAAAAA
题目名称 [清华集训 2012] 模积和 最终得分 100
用户昵称 Gravatarhsl_beat 是否通过 通过
代码语言 C++ 运行时间 0.066 s
提交时间 2025-09-25 20:52:33 内存使用 3.67 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 19940417;
int fastpow(int a, int b)
{
    int res = 1;
    while (b) {
        if (b & 1) {
            res = (res * a) % mod;
        }
        a = (a * a) % mod;
        b >>= 1;
    }
    return res;
}
int calc(int x)
{
    return (x * (x + 1) / 2) % mod;
}
int calcc(int x)
{
    return (((x * (x + 1)) % mod * (2 * x + 1)) % mod * 3323403) % mod;
}
signed main()
{
    freopen("modmuladd.in", "r", stdin);
    freopen("modmuladd.out", "w", stdout);
    int n, m;
    cin >> n >> m;
    if (n > m) {
        swap(n, m);
    }
    int ans1 = 0;
    for (int l = 1; l <= n; ) {
        int r = n / (n / l);  
        int d = n / l;
        ans1 = (ans1 + mod + ((calc(r) - calc(l - 1)) * d) % mod) % mod;  
        l = r + 1;
    }
    ans1 = (n * n % mod + mod - ans1) % mod;  
    int ans2 = 0;
    for (int l = 1; l <= m; ) {
        int r = m / (m / l);  
        int d = m / l;
        ans2 = (ans2 + mod + ((calc(r) - calc(l - 1)) * d) % mod) % mod;  
        l = r + 1;
    }
    ans2 = (m * m % mod + mod - ans2) % mod;
    int ans = ans1 * ans2 % mod;
    int ans3 = 0;
    for (int l = 1; l <= n; ) {
        int r = min(n / (n / l), m / (m / l));  
        int d1 = n / l;
        int d2 = m / l;
        int b = ((calc(r) - calc(l - 1) + mod) % mod * (d1 * m % mod + d2 * n % mod)) % mod;  
        int c = (((calcc(r) - calcc(l - 1) + mod) % mod * d1) % mod * d2) % mod;  
        ans3 = (ans3 + (((r - l + 1) * n) % mod * m) % mod + mod - b + c) % mod;  
        l = r + 1;
    }
    ans = (ans - ans3 + mod) % mod;  
    cout << ans;
    return 0;
}