P3935 Calculating

题目描述

若xx分解质因数结果为\(x=p_1^{k_1}p_2^{k_2}\cdots p_n^{k_n}\),令\(f(x)=(k_1+1)(k_2+1)\cdots (k_n+1)\),求\(\sum_{i=l}^r\)对998244353取模的结果。


\(f(x)=(k_1+1)(k_2+1)\cdots (k_n+1)\)看起来有点眼熟啊

这不就是因数个数嘛!!

首先定义\[f(x)=\sum_{i=1}^xd(i)=\sum_{i=1}^x\lfloor\frac{x}{i}\rfloor\]

那么\(ans=f(r)-f(l-1)\)

除法分块一下就是\(O(\sqrt{n})\)的!!


#include<iostream>
#include<cstdio>
#include<cstring>
#define N 998244353
#define LL long long
using namespace std;
LL n,m,L,R;
int main()
{
    scanf("%lld%lld",&n,&m);
    n-=1;
    for(LL l=1,r;l<=n;l=r+1)
    {
        r=n/(n/l);
        L+=(n/l)*(r-l+1)%N;
    }   
    for(LL l=1,r;l<=m;l=r+1)
    {
        r=m/(m/l);
        R+=(m/l)*(r-l+1)%N;
    }
    printf("%lld",((R-L)%N+N)%N);
}

luogu有100个测试点克海星
1437515-20190108205650132-2106267296.png

转载于:https://www.cnblogs.com/ZUTTER/p/10241397.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值