若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)f(x)=(k1+1)(k2+1)⋯(kn+1),\)求\(\sum_{i=l}^rf(i)\)對\(998244353\)取模的結果。html
輸入格式:c++
輸入共一行,兩個數,\(l,r。\)spa
輸出格式:code
輸出共一行,一個數,爲\(\sum_{i=l}^rf(i)\)對\(998244353\)取模的結果。htm
輸入樣例#1:blog
2 4get
輸出樣例#1:it
7io
若是你作過一些莫比烏斯反演的題,那麼這道題能夠說就是一個整除分塊的模板模板
首先咱們須要知道一個定理:約數個數定理
設\(f(x)\)爲\(x\)的約數個數
\[n=\prod_{i=1}^k{p_i^{a_i}}\to f(n)=\prod_{i=1}^k{(a_i+1)}\]
上述式子中,\(p_i\)爲質數
證實:
由約數定義可知\(p1^{a1}\)的約數有:\(p1^0, p1^1, p1^2......p1^a1\) ,共\((a1+1)\)個;同理\(p2^{a2}\)的約數有\((a2+1)\)個......\(pk^{ak}\)的約數有\((ak+1)\)個。根據乘法原理答案就是上述式子
考慮一下題目所求,
\[Ans=\sum_{i=l}^{r}f(i)\]
轉換一下變成
\[Ans=\sum_{i=1}^rf(i)-\sum_{i=1}^{l-1}f(i)\]
對於\(f(n)\),咱們能夠認爲
\[f(n)=\sum_{d|n}1\]
令\(Ans1=\sum_{i=1}^rf(i)\),由此推出
\[Ans1=\sum_{i=1}^r\sum_{d|i}1\]
更換枚舉項,改成枚舉i的因子
\[Ans1=\sum_{d=1}^r\lfloor\frac{r}{d}\rfloor\]
同理求出\(Ans2\),而後用一下整除分塊\(O(\sqrt n)\)預處理就能夠了,不會的看一下我上面放的連接
#include<bits/stdc++.h> #define rg register #define il inline #define Min(a,b) (a)<(b)?(a):(b) #define Max(a,b) (a)>(b)?(a):(b) #define lol long long using namespace std; const lol mod=998244353; void in(lol &ans) { ans=0; lol f=1; char i=getchar(); while(i<'0' || i>'9') {if(i=='-') f=-1; i=getchar();} while(i>='0' && i<='9') ans=(ans<<1)+(ans<<3)+i-'0',i=getchar(); ans*=f; } int main() { lol ans1=0,ans2=0; lol n,m; in(n),in(m),n--; for(rg lol l=1,r,len;l<=n;l=r+1) { r=n/(n/l),len=r-l+1; ans1=(1ll*(ans1%mod+len%mod*(n/l)%mod)%mod)%mod; } for(rg lol l=1,r,len;l<=m;l=r+1) { r=m/(m/l),len=r-l+1; ans2=(1ll*(ans2%mod+len%mod*(m/l)%mod)%mod)%mod; } printf("%lld\n",(ans2-ans1+mod)%mod);//注意這裏,最後答案必定要(ans+mod)%mod,否則可能會出現負數 return 0; }