题目大意

设数根函数为 d(n)d(n),求 [1,n][1, n]d(ab)=d(c)d(ab) = d(c)abcab \ne c 的元素有多少个。

分析

ai=j=1n[d(j)=i] a_i = \sum_{j=1}^n [d(j) = i]

故答案为

ans=i=1nj=1nad(ij)[ijn]=i=08j=08aiajad(ij)i=1nni \begin{aligned} ans &= \sum_{i=1}^n \sum_{j=1}^n a_{d(ij)} - [ij \leqslant n] \\ &= \sum_{i=0}^8 \sum_{j=0}^8 a_i a_j a_{d(ij)} - \sum_{i=1}^n \left\lfloor \frac{n}{i} \right\rfloor \end{aligned}

除了整除分块的 O(n)O(\sqrt{n}) 外,复杂度 O(9)O(9)

int main() {
	int n;
	std::cin >> n;
	V<int> a(9);
	for (int i = 0; i < 9; i++) {
		a[i] = n / 9 + (i <= n % 9);
	}
	a[0]--;

	ll ans = 0;
	for (int i = 0; i < 9; i++) {
		for (int j = 0; j < 9; j++) {
			ans += 1ll * a[i] * a[j] * a[i * j % 9];
		}
	}
	for (int l = 1, r; l <= n; l = r + 1) {
		r = n / (n / l);
		ans -= 1ll * (r - l + 1) * (n / l);
	}
	std::cout << ans;

	return 0;
}

全部代码请看:Codeforces/other/10C.cpp