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

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

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

套用陈老师r老师等式后反演




#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 maxn=10000000;

int prime[1000000],num;
int vst[maxn+5],miu[maxn+5];

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

unordered_map<ll,int> S;

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++) (tem+=P-Sum(n/l))%=P;
  for (ll t=n/l;l<=n;l=r+1,t--)
    r=n/t,(tem+=P-(r-l+1)*Sum(t)%P)%=P;
  return S[n]=tem;
}

inline ll sum(ll n){
  ll tem=0; ll l,r;
  for (l=1;l*l<=n;l++) (tem+=n/l)%=P;
  for (ll t=n/l;l<=n;l=r+1,t--)
    r=n/t,(tem+=(r-l+1)*(n/l)%P)%=P;
  return (ll)tem*tem%P;
}

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


查看评论

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

吉丽博客传送门:http://jiruyi910387714.is-programmer.com/posts/195270.html 套用公式后反演 然后杜教筛求和 比较有意思的是其间我算...
  • u014609452
  • u014609452
  • 2017-01-26 23:01:19
  • 939

洛谷 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

[BZOJ4176]Lucas的数论(莫比乌斯反演+杜教筛)

题目描述传送门题解做约数个数和的时候有一个结论: d(nm)=∑i|n∑j|m[(i,j)=1]d(nm)=\sum\limits_{i|n}\sum\limits_{j|m}[(i,j)=1] ...
  • Clove_unique
  • Clove_unique
  • 2017-03-28 10:59:58
  • 1028

bzoj 4176: Lucas的数论 (反演)

题目描述传送门题目大意: 设f(ij)表示i*j的约束个数,求 ∑i=1n∑j=1nf(ij) mod 1e9+7\sum\limits_{i=1}^n\sum\limits_{j=1}^n f(...
  • clover_hxy
  • clover_hxy
  • 2017-03-20 11:39:22
  • 339

bzoj 4176 Lucas的数论 莫比乌斯反演

∑ni=1∑nj=1d(i,j)=∑ni=1∑nj=1∑n2k=1[k|ij]\sum_{i=1}^{n}\sum_{j=1}^{n}d(i,j)=\sum_{i=1}^{n}\sum_{j=1}^{...
  • make_it_for_good
  • make_it_for_good
  • 2016-11-02 14:53:53
  • 486

BZOJ 4176 Lucas的数论

BZOJ 4176 Lucas的数论原题链接: http://www.lydsy.com/JudgeOnline/problem.php?id=4176题目是要求计算:∑i=1n∑j=1n∑d|i...
  • ZLH_HHHH
  • ZLH_HHHH
  • 2017-09-05 12:09:10
  • 197

[杜教筛] BZOJ4176. Lucas的数论

陈老师R老师等式∑i=1n∑j=1nf(ij)=∑i=1n∑j=1n⌊ni⌋⌊nj⌋[(i,j)=1]\sum_{i=1}^n\sum_{j=1}^n f(ij)=\sum_{i=1}^n\sum_{...
  • Coldef
  • Coldef
  • 2017-12-21 13:18:25
  • 140

BZOJ 4176: Lucas的数论 莫比乌斯反演 杜教筛

4176: Lucas的数论 Time Limit: 30 Sec  Memory Limit: 256 MB Submit: 378  Solved: 242 [Submit][Status]...
  • BlackJack_
  • BlackJack_
  • 2017-11-23 13:23:33
  • 141

BZOJ 4176 Lucas的数论 莫比乌斯反演

题目大意:给定n(n≤109)n(n\leq10^9),求∑ni=1∑nj=1d(ij)\sum_{i=1}^n\sum_{j=1}^nd(ij)推错式子害死人。。。 由d|ijd|ij等价于dgc...
  • PoPoQQQ
  • PoPoQQQ
  • 2015-07-10 18:20:57
  • 3041

bzoj 3944: Sum 杜教筛

本来以为这种东西只能O(N)线性筛,但是大千世界,无(sang)奇(xin)不(bing)有(kuang),确实存在更快的算法。        省选的时候rzz讲这种东西在国内OI称为杜教筛,用来求数...
  • lych_cys
  • lych_cys
  • 2016-03-24 20:45:40
  • 5519
    个人资料
    持之以恒
    等级:
    访问量: 40万+
    积分: 1万+
    排名: 1230
    文章分类
    最新评论