2024 BUPT Programming Contest F

简要题意

多测,给定一个 n×n 矩阵,矩阵中的每一个元素的计算方式如下:

  • 矩阵的行和列唯一决定两个整数对 (a,b),矩阵第 a(0a<n) 行第 b(0b<n) 列的元素为 a×bmodn

求矩阵中元素 m 出现的次数。

  • 0m<n1012

  • 1T100

题解

对于矩阵中的任意一个元素是独立的,因此我们考虑对于一组 a×bm(modn) 的合法性。

原式可推出 ab+kn=m,由裴蜀定理可知,当 gcd(a,n)m 时,方程有线性整数解。

接下来考虑对于一个合法的 a 有多少组解是可以被接受的,由于 at=sn,我们想要找到尽可能小的 (s,t) 的一组解,那么 t=ngcd(a,n),若 abm(modn),那么 a(b+ngcd(a,n))m(modn)

对于最小的二元组 (a,b) 使原式成立,必有 b<ngcd(a,n) 成立,若有 bngcd(a,n),则由 a(b+ngcd(a,n))m(modn) 可递归定义最小的 b

因此,对于任何合法的 a,必存在最小的二元组 (a,b) 使得同余式成立,因此所有的合法解为:

n1a=0nngcd(a,n)[gcd(a,n)m]=n1a=0gcd(a,n)[gcd(a,n)m]=na=1gcd(a,n)[gcd(a,n)m]=dmdna=1[gcd(a,n)=d]=dm,dndna=1[gcd(a,n)=d]=dgcd(n,m)dna=1[gcd(ad,nd)=1]=dgcd(n,m)dnda=1[gcd(a,nd)=1]=dgcd(n,m)dφ(nd)

参考代码

复制#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 10, mod = 998244353;
ll n, m;
ll primes[N], phi[N], cnt;
bool st[N];

void init()
{
    phi[1] = 1;
    for (int i = 2; i < N; i ++ )
    {
        if (!st[i]) primes[cnt ++ ] = i, phi[i] = i - 1;
        for (int j = 0; primes[j] * i < N; j ++ )
        {
            st[primes[j] * i] = 1;
            if (i % primes[j] == 0)
            {
                phi[primes[j] * i] = phi[i] * primes[j];
                break;
            }
            phi[primes[j] * i] = phi[i] * (primes[j] - 1);
        }
    }
}

ll get_phi(ll x)
{
    if (x < N) return phi[x];
    ll res = 1;
    for (int i = 0; primes[i] * primes[i] <= x; i ++ )
    {
        if (x % primes[i] == 0) res = res * (primes[i] - 1) % mod, x /= primes[i];
        while (x % primes[i] == 0) res = res * primes[i] % mod, x /= primes[i];
    }
    if (x > 1) res = res * (x - 1) % mod;
    return res;
}

void solve()
{
    cin >> m >> n;
    ll g = __gcd(m, n), ans = 0;
    for (ll i = 1; i * i <= g; i ++ )
        if (g % i == 0)
        {
            (ans += i * get_phi(n / i) % mod) %= mod;
            if (i * i != g) (ans += (g / i) % mod * get_phi(n / (g / i)) % mod) %= mod;
        }
    cout << ans << endl;
}

int main()
{
    int T;
    init();
    cin >> T;
    while (T -- ) solve();
    return 0;
}
posted @   YipChip  阅读(12)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示