约数和
Posted hehe54321
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了约数和相关的知识,希望对你有一定的参考价值。
简单来讲,就是要求$sum_{i=1}^n(sum_{d|i}d)$
$$sum_{i=1}^n(sum_{d|i}d)=sum_{i=1}^n(sum_{j=1}^n{[j|i]*j})=sum_{j=1}^n(sum_{i=1}^n{[j|i]*j})=sum_{j=1}^n(j*{lfloor}{frac{n}{j}}{ floor})$$
$[j|i]$表示如果j是i的因子则为1,否则为0
(sigma性质?https://wenku.baidu.com/view/1006651014791711cc79171f.html)
所以就跟https://www.cnblogs.com/hehe54321/p/7307069.html一样了。。。
题面就有很多了。。。
https://www.luogu.org/problemnew/show/P2424
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 ll x,y,ans; 14 int main() 15 { 16 ll i,j; 17 scanf("%lld%lld",&x,&y); 18 for(i=1;i<=y;i=j+1) 19 { 20 j=min(y,y/(y/i)); 21 ans+=(y/i)*(i+j)*(j-i+1)/2; 22 } 23 x--; 24 for(i=1;i<=x;i=j+1) 25 { 26 j=min(x,x/(x/i)); 27 ans-=(x/i)*(i+j)*(j-i+1)/2; 28 } 29 printf("%lld",ans); 30 return 0; 31 }
http://210.33.19.103/problem/3415
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 ll y,ans; 14 int main() 15 { 16 ll i,j; 17 scanf("%lld",&y); 18 if(y==0) 19 { 20 puts("0"); 21 return 0; 22 } 23 for(i=1;i<=y;i=j+1) 24 { 25 j=min(y,y/(y/i)); 26 ans+=(y/i)*(i+j)*(j-i+1)/2; 27 } 28 ans-=y;ans-=(y+1)*y/2;ans++; 29 printf("%lld",ans); 30 return 0; 31 }
以上是关于约数和的主要内容,如果未能解决你的问题,请参考以下文章