简要题意

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

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

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

  • \(0 \le m < n \le 10^{12}\)

  • \(1 \le T \le 100\)

题解

对于矩阵中的任意一个元素是独立的,因此我们考虑对于一组 \(a \times b \equiv m \pmod n\) 的合法性。

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

接下来考虑对于一个合法的 \(a\) 有多少组解是可以被接受的,由于 \(at = sn\),我们想要找到尽可能小的 \((s, t)\) 的一组解,那么 \(t = \frac{n}{\gcd(a, n)}\),若 \(ab \equiv m \pmod n\),那么 \(a\left(b + \frac{n}{\gcd(a, n)}\right) \equiv m \pmod n\)。

对于最小的二元组 \((a, b)\) 使原式成立,必有 \(b < \frac{n}{\gcd(a, n)}\) 成立,若有 \(b \ge \frac{n}{\gcd(a, n)}\),则由 \(a\left(b + \frac{n}{\gcd(a, n)}\right) \equiv m \pmod n\) 可递归定义最小的 \(b\)。

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

\[\begin{aligned}

\sum_{a = 0}^{n - 1}\left\lfloor\frac{n}{\frac{n}{\gcd(a, n)}}\right\rfloor[\gcd(a, n) \mid m] &= \sum_{a = 0}^{n - 1}\gcd(a, n)[\gcd(a, n) \mid m] \\

&= \sum_{a = 1}^{n}\gcd(a, n)[\gcd(a, n) \mid m] \\

&= \sum_{d \mid m}d\sum_{a = 1}^{n}[\gcd(a, n) = d] \\

&= \sum_{d \mid m, d \mid n}d\sum_{a = 1}^{n}[\gcd(a, n) = d] \\

&= \sum_{d \mid \gcd(n, m)}d\sum_{a = 1}^{n}\left[\gcd\left(\frac{a}{d}, \frac{n}{d}\right) = 1\right] \\

&= \sum_{d \mid \gcd(n, m)}d\sum_{a = 1}^{\frac{n}{d}}\left[\gcd\left(a, \frac{n}{d}\right) = 1\right] \\

&= \sum_{d \mid \gcd(n, m)}d\varphi\left(\frac{n}{d}\right)

\end{aligned}
\]

参考代码

#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;
}

2024 BUPT Programming Contest F的更多相关文章

  1. Gym 100952F&&2015 HIAST Collegiate Programming Contest F. Contestants Ranking【BFS+STL乱搞(map+vector)+优先队列】

    F. Contestants Ranking time limit per test:1 second memory limit per test:24 megabytes input:standar ...

  2. IX Samara Regional Intercollegiate Programming Contest F 三分

    F. Two Points time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...

  3. 2018-2019 ACM-ICPC Brazil Subregional Programming Contest F. Music Festival

    题目:https://codeforces.com/gym/101908/problem/F 题意:给你n个舞台,每个舞台有很多个节目,每个节目有个开始时间,结束时间,价值,每个舞台至少出演过一个节目 ...

  4. The 2019 ICPC China Nanchang National Invitational and International Silk-Road Programming Contest - F.Sequence(打表+线段树)

    题意:给你一个长度为$n$的数组,定义函数$f(l,r)=a_{l} \oplus a_{l+1} \oplus...\oplus a_{r}$,$F(l,r)=f(l,l)\oplus f(l,l+ ...

  5. 2018 ACM-ICPC, Syrian Collegiate Programming Contest F - Pretests SOS dp

    #include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk mak ...

  6. The Ninth Hunan Collegiate Programming Contest (2013) Problem F

    Problem F Funny Car Racing There is a funny car racing in a city with n junctions and m directed roa ...

  7. [AtCoder] NIKKEI Programming Contest 2019 (暂缺F)

    [AtCoder] NIKKEI Programming Contest 2019   本来看见这一场的排名的画风比较正常就来补一下题,但是完全没有发现后两题的AC人数远少于我补的上一份AtCoder ...

  8. zoj The 12th Zhejiang Provincial Collegiate Programming Contest Capture the Flag

    http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5503 The 12th Zhejiang Provincial ...

  9. zoj The 12th Zhejiang Provincial Collegiate Programming Contest Convert QWERTY to Dvorak

    http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5502  The 12th Zhejiang Provincial ...

  10. 2016 Sichuan Province Programming Contest

    2016 Sichuan Province Programming Contest 代码 2016 Sichuan Province Programming Contest A. Nearest Ne ...

随机推荐

  1. Java 读取命令行输入

    在 Java 中,您可以使用 Scanner 类从命令行读取输入.这个类属于 java.util 包,因此在使用之前您需要导入该包. 下面是一个如何从命令行读取输入的 Java 程序示例: impor ...

  2. 【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常

    问题现象 BeetISQL中间件版本:2.13.8.RELEASE 客户在调用BeetISQL提供的api向yashandb的表中执行batch insert并将返回sequence设置到传入的jav ...

  3. 线性dp:LeetCode516 .最长回文子序列

    LeetCode516 .最长回文子序列 题目叙述: 力扣题目链接(opens new window) 给你一个字符串 s ,找出其中最长的回文子序列,并返回该序列的长度. 子序列定义为:不改变剩余字 ...

  4. 使用 Helm 在 Kubernetes 上安装 Consul

    Consul Sync 部署 官方文档部署:https://developer.hashicorp.com/consul/docs/k8s/installation/install 部署版本 1.14 ...

  5. vue 实现组件全屏展示及退出

    vue 实现组件全屏展示及退出 一.组件 采用 vue-fullscreen 组件 二.实现方式 <fullscreen ref="fullscreen" @change=& ...

  6. 论文阅读翻译之Deep reinforcement learning from human preferences

    论文阅读翻译之Deep reinforcement learning from human preferences 关于 首次发表日期:2024-09-11 论文原文链接:https://arxiv. ...

  7. C# – 冷知识 (新手)

    替 Action/Func Parameter 设置名字 public static void MatchBracket(string value, string bracket, Action< ...

  8. 人脸识别 face detect & recognize

    前言 最近有一个项目要升级. 它是一个在线教育的 web app. 由于学生年龄小, 不适合用 username/password 这种方式做登入. 所以项目开始之初是使用 RFID 来登入的. 但由 ...

  9. Figma 学习笔记 – Prototype

    挺简单的, 只要知道它有什么, 基本上就会用了 监听 Event Type 监听 Callback Action 过度 Animation Frame Scrolling

  10. [OI] 容斥原理拓展

    10.容斥原理拓展 10.1 二项式反演 \[P.10.1(1) \] 设 \(U=\{S_1,S_2,S_3...S_n\}\),且任意 \(i\) 个元素的交集都相等 定义 \(g(x)\) 为 ...