1 条题解
-
0
自动搬运
来自洛谷,原作者为

tbdsh
到,天边去生活?|| AFOed on 2025.07.07 || 最后在线时间:2025年8月18日19时14分搬运于
2025-08-24 22:41:17,当前版本为作者最后更新于2024-02-23 15:06:04,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
题意简述
给定 ,求 $\sum\limits^n_{i=1}\sum\limits^n_{j=1}\gcd(i,j)^2 \bmod (10^9+7)$。
分析
首先可以用 的时间复杂度打出一个 的表:

我们想要求出 ,那么就是求 ,其中, 指 在上述 的矩阵中的出现次数。
同时可以发现, 与 一一对应,且如果序列中位置 的值是 ,那么应该有 。所以下文中我们用 代替 。
我们联想一下:在一个 的矩阵中, 应该在这四个位置中出现:。但是,位置 的值 占掉了 的位置。所以 的出现次数应该是 。
进一步的,我们可以发现:如果位置 的值为 ,那么所有值为 的位置都会占用 的位置。
那么,在不考虑占用的情况下,令 ,。由于存在占用,那么 $C_{x}\gets C_x-\sum\limits^{\lceil \frac{n}{x} \rceil}_ {k=2}C_{kx}$。
可以注意到,此时我们需要的遍历顺序是 。
最终答案就是 。
时间复杂度:。
空间复杂度:。
Code
#include<bits/stdc++.h> #define int long long using namespace std; const int Mod = 1e9 + 7, MAXN = 1e7 + 5; int cnt[MAXN]; signed main(){ ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int n, ans = 0; cin >> n; for (int i = n; i >= 1; i--){ cnt[i] = (n - n % i) / i * (n - n % i) / i; for (int j = 2; i * j <= n; j++){ cnt[i] -= cnt[i * j]; } (ans += i * i % Mod * (cnt[i] % Mod)) %= Mod; } cout << ans; return 0; }
- 1
信息
- ID
- 8128
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者