AT_agc038_c 做题笔记
莫反好题,不仅仅是莫反,还有很多思维含量。
由于推式子过程太过于漫长了,所以我仅仅讲下大概。
题目是给你一个长度为
莫反通常是对于值域考虑,直接推是不可行的,所以开一个桶
对值域分类的话就只能把忽略大小关系的
多说一句,我刚开始没忽略大小关系,是
推式子,大概就是先把
此时有一个整除的条件,枚举的时候枚举倍数就行了,最后把所有
推完后是:
此时令
对
代码:
#include <bits/stdc++.h> #define int long long #define For(i, a, b) for (int i = (a); i <= (b); i ++) #define foR(i, a, b) for (int i = (a); i >= (b); i --) using namespace std; int n, x, ans, cnt; int b[1000005], f[1000005]; int mu[1000005], primes[200005]; bool prime[1000005]; const int mod = 998244353; void init () { mu[1] = 1; For (i, 2, 1000000) { if (!prime[i]) { primes[++ cnt] = i; mu[i] = -1; } for (int j = 1; j <= cnt && i * primes[j] <= 1000000; j ++) { prime[i * primes[j] ] = 1; if (i % primes[j] == 0) break; mu[i * primes[j] ] = -mu[i]; } } } void solve () { init (); cin >> n; For (i, 1, n) { cin >> x; ans -= x; ++ b[x]; } ans = (ans % mod + mod) % mod; For (i, 1, 1000000) { For (j, 1, 1000000 / i) f[i] += j * b[i * j]; f[i] %= mod; } For (i, 1, 1000000) { int x = 1000000 / i, res = 0; For (j, 1, x) { res += mu[j] * j * j % mod * f[i * j] % mod * f[i * j] % mod; if (res >= mod) res -= mod; if (res <= mod) res += mod; } ans += i * res % mod; if (ans >= mod) ans -= mod; } cout << ans * 499122177 % mod; } signed main () { int _ = 1; // cin >> _; while (_ --) { solve (); cout << '\n'; } return 0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异