码迷,mamicode.com
首页 > 其他好文 > 详细

[51nod1244]莫比乌斯函数之和

时间:2018-03-01 11:50:25      阅读:114      评论:0      收藏:0      [点我收藏+]

标签:return   clu   bre   post   iterator   res   nod   mes   sum   

推公式,设$A(n)=\sum\limits_{i=1}^n\mu(i)$,令$B(n)=1$,则推出$C(n)=(A*B)(n)=[n=1]$

$$\begin{align*}\sum\limits_{i=1}^n[i=1]&=\sum\limits_{i=1}^n\sum\limits_{d|i}\mu(d)\\1&=\sum\limits_{d=1}^n\sum\limits_{\substack{d|i\\i\leq n}}\mu(d)\\1&=\sum\limits_{d=1}^n\mu(d)\left\lfloor\dfrac nd\right\rfloor\\1&=\sum\limits_{d=1}^nA\left(\left\lfloor\dfrac nd\right\rfloor\right)\\A(n)&=1-\sum\limits_{d=2}^nA\left(\left\lfloor\dfrac nd\right\rfloor\right)\end{align*}$$

然后就做完了

#include<stdio.h>
#include<map>
using namespace std;
#define ll long long
#define T 1000000
int pr[1000010],mu[1000010];
bool np[1000010];
void sieve(){
	ll i,j,m=0;
	np[1]=1;
	mu[1]=1;
	for(i=2;i<=T;i++){
		if(!np[i]){
			m++;
			pr[m]=i;
			mu[i]=-1;
		}
		for(j=1;j<=m;j++){
			if(pr[j]*i>T)break;
			np[i*pr[j]]=1;
			if(i%pr[j]==0)break;
			mu[i*pr[j]]=-mu[i];
		}
	}
	for(i=2;i<=T;i++)mu[i]+=mu[i-1];
}
map<ll,ll>res;
map<ll,ll>::iterator it;
ll dj(ll n){
	if(n<=T)return mu[n];
	it=res.find(n);
	if(it!=res.end())return it->second;
	ll i,las,s=1;
	for(i=2;i<=n;i=las+1){
		las=n/(n/i);
		s-=(las-i+1)*dj(n/i);
	}
	return res[n]=s;
}
int main(){
	sieve();
	ll l,r;
	scanf("%lld%lld",&l,&r);
	printf("%lld",dj(r)-dj(l-1));
}

[51nod1244]莫比乌斯函数之和

标签:return   clu   bre   post   iterator   res   nod   mes   sum   

原文地址:https://www.cnblogs.com/jefflyy/p/8487242.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!