2024 BUPT Programming Contest F
简要题意
多测,给定一个
- 矩阵的行和列唯一决定两个整数对
,矩阵第(a,b) 行第a(0≤a<n) 列的元素为b(0≤b<n) a×bmodn
求矩阵中元素
-
0≤m<n≤1012 -
1≤T≤100
题解
对于矩阵中的任意一个元素是独立的,因此我们考虑对于一组
原式可推出
接下来考虑对于一个合法的
对于最小的二元组
因此,对于任何合法的
参考代码
复制#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具