专栏文章

【[ABC414E] Count A%B=C】题解

AT_abc414_e题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miowvy05
此快照首次捕获于
2025/12/03 02:28
3 个月前
此快照最后确认于
2025/12/03 02:28
3 个月前
查看原文

思路

先分析条件。
  1. amodb=ca\bmod b=c
    一个 aa 和一个 bb 对应一个 cc
  2. 1a,b,cN1\le a,b,c\le N
    限定了 a,b,ca,b,c 的范围,以及 bab\nmid a
  3. a,b,ca,b,c 各不相同
    限定了 a>ba>b

考虑一个 bb 对答案的贡献,即 (b,N]\lparen b,N\rbrack 范围内不是 bb 的倍数的整数个数,即 N(b1)NbN-(b-1)-\left\lfloor\frac{N}{b}\right\rfloor
则答案为:
i=1N[N(i1)Nb]=N2i=1N(i1)i=1NNb=N2N(N1)2i=1NNb=N2+N2i=1nNb\begin{align*} &\sum_{i=1}^N\left[N-(i-1)-\left\lfloor\frac{N}{b}\right\rfloor\right] \\ =&N^2-\sum_{i=1}^N(i-1)-\sum_{i=1}^N\left\lfloor\frac{N}{b}\right\rfloor \\ =&N^2-\frac{N(N-1)}{2}-\sum_{i=1}^N\left\lfloor\frac{N}{b}\right\rfloor \\ =&\frac{N^2+N}{2}-\sum_{i=1}^n\left\lfloor\frac{N}{b}\right\rfloor \end{align*}
前一项可以 O(1)\Omicron\left(1\right) 计算,后一项可以使用数论分块(aka\text{aka} 根号分治,不知道怎么用的参见 UVA11526)在 O(N)\Omicron\left(\sqrt{N}\right) 时间复杂度内计算,总时间复杂度 O(N)\Omicron\left(\sqrt{N}\right)

注意事项

  1. 十年 OI 一场空,不开 __ 见祖宗;
  2. 模意义下的除法用逆元。

AC Code

CPP
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MOD = 998244353, I = 499122177;
// I 为 2 模 998244353 意义下的逆元。
ll n, ans;

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin >> n;
	ll l = 1, r = 0;
	for(; l <= n; l = r + 1){
		r = n / (n / l);
		ans -= ((r - l + 1) % MOD) * ((n / l) % MOD) % MOD;
		ans = (ans % MOD + MOD) % MOD;
	} // 数论分块
	n %= MOD;
	ans += (((n * n % MOD) + n) % MOD) * I % MOD;
	ans %= MOD;
	cout << ans;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...