【题目】
题目描述:
求 ∑ i = 1 n 2 σ 2 ( i ) + 3 σ 1 ( i ) + 5 σ 0 ( i ) \sum\limits_{i = 1} ^ n 2\sigma_2(i)+3\sigma_1(i)+5\sigma_0(i) i=1∑n2σ2(i)+3σ1(i)+5σ0(i) 对 998244353 998244353 998244353 取模。
其中, σ k ( i ) = ∑ d ∣ i d k \sigma_k(i)=\sum\limits_{d|i} d^k σk(i)=d∣i∑dk。
输入格式:
一行一个正整数 n n n。
输出格式:
一行一个正整数表示答案对 998244353 998244353 998244353 取模的结果。
样例数据:
【样例 1 1 1】
输入
2
输出
39
【样例 2 2 2】
输入
10
输出
1334
【样例 3 3 3】
输入
1000000
输出
620771835
数据范围与提示:
对于 100 % 100\% 100% 的数据, n ≤ 10 9 n \le {10} ^ 9 n≤109。
【分析】
这道题的思路其实和Calculating差不多。
就以 σ 2 ( k ) \sigma_2(k) σ2(k) 举例吧, σ 1 ( k ) \sigma_1(k) σ1(k) 和 σ 2 ( k ) \sigma_2(k) σ2(k) 本质上是一样的。
对于 i i i,在 n n n 以内它有 ⌊ n i ⌋ \lfloor\frac{n}{i}\rfloor ⌊in⌋ 个倍数,那 i i i 产生的贡献就是 i 2 ⌊ n i ⌋ i^2\lfloor\frac{n}{i}\rfloor i2⌊in⌋。
因此, ∑ i = 1 n σ 2 ( i ) = i 2 ⌊ n i ⌋ \sum\limits_{i=1}^n\sigma_2(i)=i^2\lfloor\frac{n}{i}\rfloor i=1∑nσ2(i)=i2⌊in⌋。
同理, ∑ i = 1 n σ 1 ( i ) = i ⌊ n i ⌋ \sum\limits_{i=1}^n\sigma_1(i)=i\lfloor\frac{n}{i}\rfloor i=1∑nσ1(i)=i⌊in⌋, ∑ i = 1 n σ 0 ( i ) = ⌊ n i ⌋ \sum\limits_{i=1}^n\sigma_0(i)=\lfloor\frac{n}{i}\rfloor i=1∑nσ0(i)=⌊in⌋。
那原式就可以化简了
∑ i = 1 n ⌊ n i ⌋ ( 2 i 2 + 3 i + 5 ) \sum_{i=1}^n\lfloor\frac{n}{i}\rfloor(2i^2+3i+5) i=1∑n⌊in⌋(2i2+3i+5)
进一步化简就是
2 ∑ i = 1 n i 2 ⌊ n i ⌋ + 3 ∑ i = 1 n i ⌊ n i ⌋ + 5 ∑ i = 1 n ⌊ n i ⌋ 2\sum_{i=1}^ni^2\lfloor\frac{n}{i}\rfloor+3\sum_{i=1}^ni\lfloor\frac{n}{i}\rfloor+5\sum_{i=1}^n\lfloor\frac{n}{i}\rfloor 2i=1∑ni2⌊in⌋+3i=1∑ni⌊in⌋+5i=1∑n⌊in⌋
用整除分块就可以轻松解决。
这里补一个小知识,即如何计算 ∑ i = 1 n i 2 \sum\limits_{i=1}^ni^2 i=1∑ni2。(整除分块计算时要用到)
∵ ( n + 1 ) 3 = n 3 + 3 n 2 + 3 n + 1 \because(n+1)^3=n^3+3n^2+3n+1 ∵(n+1)3=n3+3n2+3n+1
∴ ∑ i = 2 n + 1 i 3 = ∑ i = 1 n i 3 + 3 ∑ i = 1 n i 2 + 3 ∑ i = 1 n i + n \therefore \sum\limits_{i=2}^{n+1}i^3=\sum\limits_{i=1}^ni^3+3\sum\limits_{i=1}^ni^2+3\sum\limits_{i=1}^ni+n ∴i=2∑n+1i3=i=1∑ni3+3i=1∑ni2+3i=1∑ni+n
∴ 3 ∑ i = 1 n i 2 = ( n + 1 ) 3 − 1 3 − 3 ( 1 + n ) ⋅ n 2 − n \therefore 3\sum\limits_{i=1}^ni^2=(n+1)^3-1^3-3\frac{(1+n)\cdot n}{2}-n ∴3i=1∑ni2=(n+1)3−13−32(1+n)⋅n−n
∴ ∑ i = 1 n i 2 = n ( n + 1 ) ( 2 n + 1 ) 6 \therefore \sum\limits_{i=1}^ni^2=\frac{n(n+1)(2n+1)}6 ∴i=1∑ni2=6n(n+1)(2n+1)
【代码】
#include<cstdio>
#include<cstring>
#include<algorithm>
#define Mod 998244353
#define inv2 499122177
#define inv6 166374059
using namespace std;
long long calc(int n)
{
return 1ll*n*(n+1)%Mod*(2*n+1)%Mod*inv6%Mod;
}
int main()
{
int n,i,j;
scanf("%d",&n);
long long s1=0,s2=0,s3=0;
for(i=1;i<=n;i=j+1)
{
j=n/(n/i);
s1=(s1+1ll*(calc(j)-calc(i-1)+Mod)%Mod*(n/i)%Mod)%Mod;
s2=(s2+1ll*(i+j)*(j-i+1)%Mod*inv2%Mod*(n/i)%Mod)%Mod;
s3=(s3+1ll*(j-i+1)*(n/i))%Mod;
}
printf("%lld",(2*s1+3*s2+5*s3)%Mod);
return 0;
}