[2021CCPC威海热身赛] Number Theory (打表 推公式)

题意

∑ k = 1 n ∑ i ∣ k ∑ j ∣ i λ ( i ) λ ( j ) \sum_{k = 1}^{n}\sum_{i \mid k} \sum_{j \mid i} \lambda(i) \lambda(j) k=1∑n​i∣k∑​j∣i∑​λ(i)λ(j)

对 998244353 998244353 998244353 取模

其中 λ ( x ) = ( − 1 ) ∑ i e i , x = ∏ i p i e i \lambda(x) = (-1)^{\sum\limits_{i}e_i},x=\prod\limits_{i}p_i^{e_i} λ(x)=(−1)i∑​ei​,x=i∏​piei​​

分析:

λ ( x ) \lambda(x) λ(x) 为刘维尔函数,可以打表发现 ∑ d ∣ n λ ( d ) = [ n = a 2 , a ∈ N + ] \sum_{d \mid n}\lambda(d) =[n = a^2,a \in N^+] d∣n∑​λ(d)=[n=a2,a∈N+]

也就是 n n n 是否为完全平方数

把式子中的 λ ( i ) \lambda(i) λ(i) 提到前面

∑ k = 1 n ∑ i ∣ k λ ( i ) ∑ j ∣ i λ ( j ) \sum_{k = 1}^{n}\sum_{i \mid k} \lambda(i)\sum_{j \mid i} \lambda(j) k=1∑n​i∣k∑​λ(i)j∣i∑​λ(j)

那么就变为

∑ k = 1 n ∑ i ∣ k λ ( i ) [ i = a 2 , a ∈ N + ] \sum_{k = 1}^{n}\sum_{i \mid k} \lambda(i)[i= a^2,a \in N^+] k=1∑n​i∣k∑​λ(i)[i=a2,a∈N+]

那么完全平方数的刘维尔函数为 1 1 1,再设 f ( x ) = [ i = a 2 , a ∈ N + ] f(x)=[i= a^2,a \in N^+] f(x)=[i=a2,a∈N+] 得

∑ i = 1 n ∑ d ∣ n f ( d ) \sum_{i = 1}^{n}\sum_{d \mid n}f(d) i=1∑n​d∣n∑​f(d)

交换求和次序

∑ d = 1 n f ( d ) ⌊ n d ⌋ \sum_{d = 1}^{n}f(d) \lfloor\frac{n}{d}\rfloor d=1∑n​f(d)⌊dn​⌋

这样直接枚举平方数即可,时间复杂度 O ( n ) O(\sqrt{n}) O(n ​)

代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 998244353;
int n, res;
signed main() {
    cin >> n;
    for (int i = 1; i * i <= n; i ++) {
        res = (res + n / (i * i)) % mod;
    }
    cout << res << endl;
}
上一篇:matlab矩阵的表示和简单操作


下一篇:MATLAB常用操作