【LOJ 125】除数函数求和 2

【题目】

传送门

题目描述:

∑ 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=1n2σ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)=didk

输入格式:

一行一个正整数 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 n109


【分析】

这道题的思路其实和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 i2in

因此, ∑ 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=1nσ2(i)=i2in

同理, ∑ i = 1 n σ 1 ( i ) = i ⌊ n i ⌋ \sum\limits_{i=1}^n\sigma_1(i)=i\lfloor\frac{n}{i}\rfloor i=1nσ1(i)=iin ∑ i = 1 n σ 0 ( i ) = ⌊ n i ⌋ \sum\limits_{i=1}^n\sigma_0(i)=\lfloor\frac{n}{i}\rfloor i=1nσ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=1nin(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=1ni2in+3i=1niin+5i=1nin

用整除分块就可以轻松解决。

这里补一个小知识,即如何计算 ∑ i = 1 n i 2 \sum\limits_{i=1}^ni^2 i=1ni2。(整除分块计算时要用到)
∵ ( 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=2n+1i3=i=1ni3+3i=1ni2+3i=1ni+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=1ni2=(n+1)31332(1+n)nn
∴ ∑ 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=1ni2=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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值