洛谷 P3935 Calculating

虽然对这道题没有什么帮助,但是还是记一下:约数个数也是可以线性筛的

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\nmid 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}}{\rfloor})$

数论分块即可。。。

 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 }

猜你喜欢

转载自www.cnblogs.com/hehe54321/p/9297842.html