[杜教筛 约数和前缀和] 51Nod 1220 约数之和

939人阅读 评论(1) 收藏 举报
分类:

吉丽博客传送门:http://jiruyi910387714.is-programmer.com/posts/195270.html

套用公式后反演 然后杜教筛求和


比较有意思的是其间我算了两个值

后来发现这两个值竟然是相等的 都可以由约数和前缀和推导过来




#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include <tr1/unordered_map>
typedef long long ll;
using namespace std;
using namespace std::tr1;

const int P=1000000007;
const int inv2=(P+1)/2;
const int inv3=(P+1)/3;
const int maxn=1000000;

int prime[2000000],num;
int miu[maxn+5];
ll sumd[maxn+5],t1[maxn+5],t2[maxn+5]; int d[maxn+5];

inline void Pre(){
  miu[1]=1; sumd[1]=1;
  for (int i=2;i<=maxn;i++){
    if (!d[i]) d[i]=prime[++num]=i,sumd[i]=1+i,t1[i]=1+i,t2[i]=i,miu[i]=-1;
    for (int j=1;j<=num && (ll)i*prime[j]<=maxn;j++){
      d[i*prime[j]]=prime[j]; int k=i*prime[j];
      if (i%prime[j]==0){
	miu[k]=0;
	t2[k]=t2[i]*prime[j],t1[k]=t1[i]+t2[k],sumd[k]=sumd[i]/t1[i]*t1[k];
	break;
      }
      miu[i*prime[j]]=miu[i]*miu[prime[j]];
      sumd[k]=sumd[i]*sumd[prime[j]],t1[k]=1+prime[j],t2[k]=prime[j];
    }
  }
  for (int i=1;i<=maxn;i++)
    miu[i]=((ll)i*((P+miu[i])%P)%P+miu[i-1])%P,(sumd[i]+=sumd[i-1])%=P;
}

unordered_map<ll,int> S;

inline void add(int &x,int y){
  x+=y; if (x>=P) x-=P;
}

inline int sum1(ll n){ return (n+1)%P*(n%P)%P*inv2%P;}
inline int sum1(ll l,ll r){ return (l+r)%P*((r-l+1)%P)%P*inv2%P; }

inline int Sum(ll n){
  if (n<=maxn) return miu[n];
  if (S.find(n)!=S.end()) return S[n];
  int tem=1; ll l,r;
  for (l=2;l*l<=n;l++) add(tem,P-l*Sum(n/l)%P);
  for (ll t=n/l;l<=n;l=r+1,t--)
    r=n/t,add(tem,P-(ll)sum1(l,r)*Sum(t)%P);
  return S[n]=tem;
}
/*
inline int F(ll n){
  int t1=0,t2=0; ll l,r;
  for (l=1;l*l<=n;l++) add(t1,l%P*(n/l)%P),add(t2,sum1(n/l)%P);
  for (ll t=n/l;l<=n;l=r+1,t--)
    r=n/t,add(t1,(ll)sum1(l,r)*(n/l)%P),add(t2,(r-l+1)%P*sum1(n/l)%P);
  return (ll)t1*t2%P;
}
*/

inline int F(ll n){
  if (n<=maxn) return (ll)sumd[n]*sumd[n]%P;
  int t1=0; ll l,r;
  for (l=1;l*l<=n;l++) add(t1,l%P*(n/l)%P);
  for (ll t=n/l;l<=n;l=r+1,t--)
    r=n/t,add(t1,(ll)sum1(l,r)*(n/l)%P);
  return (ll)t1*t1%P;
}

int main(){
  ll n,l,r; int Ans=0;
  freopen("t.in","r",stdin);
  freopen("t.out","w",stdout);
  Pre();
  scanf("%lld",&n);
  for (l=1;l*l<=n;l++) add(Ans,(ll)(Sum(l)+P-Sum(l-1))%P*F(n/l)%P);
  for (ll t=n/l;l<=n;l=r+1,t--)
    r=n/t,add(Ans,(ll)(Sum(r)+P-Sum(l-1))%P*F(n/l)%P);
  printf("%d\n",Ans);
  return 0;
}



查看评论

[杜教筛 约数个数前缀和] BZOJ 4176 Lucas的数论

吉丽博客传送门:http://jiruyi910387714.is-programmer.com/posts/195270.html 套用陈老师r老师等式后反演 #include #inc...
  • u014609452
  • u014609452
  • 2017-01-26 22:54:41
  • 803

洛谷 P3327 [SDOI2015]约数个数和 (莫比乌斯反演)

题目描述 设d(x)d(x)d(x)为xxx的约数个数,给定NNN、MMM,求 ∑Ni=1∑Mj=1d(ij)∑i=1N∑j=1Md(ij)\sum^N_{i=1}\sum^M_{j=1}d(ij)...
  • Ab_Ever
  • Ab_Ever
  • 2017-08-06 02:15:05
  • 445

51Nod-1220-约数之和

ACM模版描述题解这个题好难,不会写,给大家提供两个好的博客,一个是我 佐学姐 的博客,讲的是杜教筛的一些总结,《特殊函数的前缀和》,这个写的的确详细,我很喜欢这篇博客,还有一个就是 skywa...
  • f_zyj
  • f_zyj
  • 2017-09-07 13:44:31
  • 252

【51nod1220】约数之和

d(k)表示k的所有约数的和。d(6) = 1 + 2 + 3 + 6 = 12。 定义S(N) = ∑1
  • chen1352
  • chen1352
  • 2017-12-07 17:16:00
  • 143

51nod 1220 约数之和 杜教筛

题意 d(k)表示k的所有约数的和。d(6) = 1 + 2 + 3 + 6 = 12。 定义S(N) = ∑1 例如:S(3) = d(1) + d(2) + d(3) + d(2) + d(4...
  • qq_33229466
  • qq_33229466
  • 2018-01-08 14:35:33
  • 93

PE 439 Sum of sum of divisors | 51nod 1220 约数之和

题目:https://projecteuler.net/problem=439以及http://www.51nod.com/onlineJudge/questionCode.html#!problem...
  • skywalkert
  • skywalkert
  • 2015-09-02 18:11:27
  • 1528

[杜教筛] 51nod1220. 约数之和

推一下考虑把 ijij 的质因数拆成 ii 和 jj 的质因数的乘积,但是直接算会有重复。令 ijij 的一个质因数是 abab,其中 a|ia|i, b|jb|j,如果满足 (a,jb)=1(a,{...
  • Coldef
  • Coldef
  • 2017-12-21 14:00:22
  • 201

51Nod 1220 约数之和&&PE439

∂(i)∂(i)表示i的约数和 ∑ni=1∑nj=1∂(ij)∑_{i=1}^{n}∑_{j=1}^{n}∂(ij) =∑ni=1∑nj=1∑w|i∑v/jwv∗∑d|w,d|(i/v)u(d)=...
  • liutian429073576
  • liutian429073576
  • 2016-11-17 07:46:22
  • 568

51nod1584 加权约数和

莫比乌斯反演+线性筛
  • sdfzyhx
  • sdfzyhx
  • 2017-06-09 19:56:34
  • 292

[杜教筛] 51Nod 1238 最小公倍数之和 V3

比最大公约数之和要难搞一些 吉丽博客传送门:http://jiruyi910387714.is-programmer.com/posts/195270.html 这道题两个要点 首先 ∑1 ...
  • u014609452
  • u014609452
  • 2017-01-26 22:45:50
  • 655
    个人资料
    持之以恒
    等级:
    访问量: 40万+
    积分: 1万+
    排名: 1230
    文章分类
    最新评论