虽然对这道题没有什么帮助,但是还是记一下:约数个数也是可以线性筛的
http://www.cnblogs.com/xzz_233/p/8365414.html
测正确性题目:https://www.luogu.org/problemnew/show/P1403
这个好像叫d函数
看$d=(a_1+1)(a_2+1)cdots(a_k+1)$
然而还不行,你还要记这个数的$a_1$(定义在上面)记为f
首先,如果p是质数,那么d(p)=2,f(p)=1
然后,将合数n分解成n=px(p是n最小的质因子),
若$p mid x$则d(n)=2d(x),f(n)=1(d乘2相当于是要不要新选p)
否则$f(n)=f(x)+1$,$d(n)=d(x)*frac{f(n)+1}{f(x)+1}$
https://www.luogu.org/problemnew/show/P3935
题目给的f(x)就是x的约数个数。。。
那么,$sum_{i=1}^n(sum_{d|n}1)=sum_{i=1}^n({lfloor}{frac{n}{i}}{ floor})$
数论分块即可。。。
1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<vector> 5 using namespace std; 6 #define fi first 7 #define se second 8 #define mp make_pair 9 #define pb push_back 10 typedef long long ll; 11 typedef unsigned long long ull; 12 typedef pair<int,int> pii; 13 #define md 998244353 14 ll x,y,ans; 15 int main() 16 { 17 ll i,j; 18 scanf("%lld%lld",&x,&y); 19 for(i=1;i<=y;i=j+1) 20 { 21 j=min(y,y/(y/i)); 22 ans+=(y/i)*(j-i+1); 23 } 24 x--; 25 for(i=1;i<=x;i=j+1) 26 { 27 j=min(x,x/(x/i)); 28 ans-=(x/i)*(j-i+1); 29 } 30 printf("%lld",ans%md); 31 return 0; 32 }