【51nod-1239&1244】欧拉函数之和&莫比乌斯函数之和 杜教筛

题目链接:

1239:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1239

1244:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1244

杜教筛裸题,不过现在我也只会筛这俩前缀和...

$$s(n)=\sum _{i=1}^{n}f(i)$$

那么就有:

$$\sum_{i=1}^{n}f(i)\lfloor \frac{n}{i} \rfloor=\sum_{i=1}^{n}s(\lfloor \frac{n}{i} \rfloor)=s(n)+\sum_{i=2}^{n}s(\lfloor \frac{n}{i} \rfloor)$$

移项得到:

$$s(n)=\sum_{i=1}^{n}f(i)\lfloor \frac{n}{i} \rfloor-\sum_{i=2}^{n}s(\lfloor \frac{n}{i} \rfloor)$$

对于欧拉函数,$f(n)=\phi(n)$

$$\sum_{i=1}^{n}\phi(i)\lfloor \frac{n}{i} \rfloor=\sum_{i=1}^{n}\sum_{d|n}\phi(d)=\sum_{i=1}^{n}i=\frac{n*(n+1)}{2}$$

对于莫比乌斯函数,$f(n)=\mu(n)$

$$\sum_{i=1}^{n}\mu(i)\lfloor \frac{n}{i} \rfloor=\sum_{i=1}^{n}\sum_{d|n}\mu(d)=\sum_{i=1}^{n}[i=1]=1$$

然后这两个公式就可以在线筛预处理$n^{\frac{2}{3}}$只后记忆化达到$O(n^{\frac{2}{3}})$的效率.

值得注意的就是,记忆化要写hash,以及不要忘了取模,筛欧拉函数前缀和时牵扯取模和除2,可以先讨论奇偶除掉2再计算。

1239:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
#define LL long long
#define N 5000000
#define P 233333
#define MAXN 250000
#define MO 1000000007
int cnt,prime[N+10],flag[N+10];
LL X,phi[N+10];
inline void Pre(LL n)
{
	flag[1]=1; phi[1]=1;
	for (LL i=2; i<=n; i++)
		{
			if (!flag[i]) prime[++cnt]=i,phi[i]=i-1;
			for (int j=1; j<=cnt && i*prime[j]<=n; j++)
				{
					flag[i*prime[j]]=1;
					if (!(i%prime[j])) {phi[i*prime[j]]=phi[i]*prime[j]; break;}
					phi[i*prime[j]]=phi[i]*(prime[j]-1);
				}
		}
	for (LL i=1; i<=n; i++) phi[i]=(phi[i]+phi[i-1])%MO;
}
struct Hash{
	int next; LL i,x;
}mp[MAXN];
int head[MAXN],tot;
inline void Add(LL i,LL x) {int pos=i%P; tot++; mp[tot].next=head[pos]; head[pos]=tot; mp[tot].i=i; mp[tot].x=x;}
inline LL Sum(LL x)
{
	if (x<=N) return phi[x];
	else
		{
			int pos=x%P;
			for (int i=head[pos]; i; i=mp[i].next)
				if (mp[i].i==x) {return mp[i].x;}
		}
	LL sum=0,s=0;
	for (LL i=2,j; i<=x; i=j+1)
		j=x/(x/i),(sum+=Sum(x/i)%MO*(j-i+1)%MO)%=MO;
	if (x&1) s=(((x+1)/2)%MO)*(x%MO)%MO; else s=((x/2)%MO)*((x+1)%MO)%MO;
	sum=(s-sum+MO)%MO;
	Add(x,sum);
	return sum;
}
int main()
{
	scanf("%lld",&X);
	Pre(N);
	printf("%lld\n",Sum(X));
	return 0;
}

1244

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
#define LL long long
#define P 233333
#define N 5000000
#define MAXN 250000
int cnt,prime[N+10],flag[N+10];
LL L,R,mu[N+10];
inline void Pre(LL n)
{
	flag[1]=1; mu[1]=1;
	for (LL i=2; i<=n; i++)
		{
			if (!flag[i]) prime[++cnt]=i,mu[i]=-1;
			for (int j=1; j<=cnt && i*prime[j]<=n; j++)
				{
					flag[i*prime[j]]=1;
					if (!(i%prime[j])) {mu[i*prime[j]]=0; break;}
					mu[i*prime[j]]=-mu[i];
				}
		}
	for (LL i=1; i<=n; i++) mu[i]+=mu[i-1];
}
struct Hash{
	int next; LL i,x;
}mp[MAXN];
int head[MAXN],tot;
inline void Add(LL i,LL x) {int pos=i%P; tot++; mp[tot].next=head[pos]; head[pos]=tot; mp[tot].i=i; mp[tot].x=x;}
inline LL Sum(LL x)
{
	if (x<=N) return mu[x];
	else
		{
			int pos=x%P;
			for (int i=head[pos]; i; i=mp[i].next)
				if (mp[i].i==x) {return mp[i].x;}
		}
	LL sum=0;
	for (LL i=2,j; i<=x; i=j+1)
		j=x/(x/i),sum+=Sum(x/i)*(j-i+1);
	Add(x,1LL-sum);
	return 1LL-sum;
}
int main()
{
	scanf("%lld%lld",&L,&R);
	Pre(N);
	printf("%lld\n",Sum(R)-Sum(L-1));
	return 0;
}
时间: 2024-10-13 23:11:09

【51nod-1239&1244】欧拉函数之和&莫比乌斯函数之和 杜教筛的相关文章

【Luogu3768】简单的数学题(莫比乌斯反演,杜教筛)

[Luogu3768]简单的数学题(莫比乌斯反演,杜教筛) 题面 洛谷 \[求\sum_{i=1}^n\sum_{j=1}^nijgcd(i,j)\] $ n<=10^9$ 题解 很明显的把\(gcd\)提出来 \[\sum_{d=1}^nd\sum_{i=1}^n\sum_{j=1}^nij[gcd(i,j)==d]\] 习惯性的提出来 \[\sum_{d=1}^nd^3\sum_{i=1}^{n/d}\sum_{j=1}^{n/d}ij[gcd(i,j)==1]\] 后面这玩意很明显的来一发

莫比乌斯反演 and 杜教筛总结

这几天做了几道和杜教筛有关的题目,赶紧记下来怕以后忘了 首先就是最常用的式子 对于一个函数f(x) 设$g(x) =\sum_{x|d}f(d)$ 则根据莫比乌斯反演有$$f(x) = \sum_{x|d}μ(\frac{d}{x})g(d)$$ 举一个最常见的例子 求$$\sum_{i=1}^{N}\sum_{j=1}^{M} [gcd(i, j) == 1]$$ 令$$g(x) =\sum_{i=1}^{N}\sum_{j=1}^{M} [x | gcd(i, j)]$$ 根据上面的公式有$

【bzoj 4176】 Lucas的数论 莫比乌斯反演(杜教筛)

Description 去年的Lucas非常喜欢数论题,但是一年以后的Lucas却不那么喜欢了. 在整理以前的试题时,发现了这样一道题目“求Sigma(f(i)),其中1<=i<=N”,其中 表示i的约数个数.他现在长大了,题目也变难了. 求如下表达式的值: 一行一个整数ans,表示答案模1000000007的值. Sample Input 2 Sample Output 8 HINT 对于100%的数据n <= 10^9. 题解: 解锁新技能:杜教筛. 再复习一下: 若$F(n)=\s

莫比乌斯反演,杜教筛

BZOJ4176 #include <cstdio> #include <map> #define LL long long using namespace std; map <LL,LL> mpa; map <LL,LL> mpb; const LL mo=1e9+7; int b[10000001],phi[10000001],ss[10000001]; int miu[10000001],summiu[10000001],cnt,n; void eul

51NOD 1237 最大公约数之和 V3(杜教筛)

题意 求 $\sum_{i=1}^n \sum_{j=1}^n gcd(i,j)$. 分析 $$\begin{aligned}\sum_{i=1}^n \sum_{j=1}^n gcd(i,j)  &= \sum_{i=1}^n \sum_{j=1}^n d[gcd(i, j)=d] \\&= \sum_{d=1}^n d \sum_{i=1}^n \sum_{j=1}^n[gcd(i,j=d)] \\&= \sum_{d=1}^n d \sum_{i=1}^{\left \lfl

数论入门——莫比乌斯函数,欧拉函数,狄利克雷卷积,线性筛,莫比乌斯反演,杜教筛

一个菜鸡对数论的一点点理解... 莫比乌斯函数 定义函数\(\mu(n)\)为: 当n有平方因子时,\(\mu(n)=0\). 当n没有平方因子时,\(\mu(n)=(-1)^{\omega(n)}\),\(\omega(n)\)表示n不同质因子的个数. 性质1: \(\sum_{d|n}\mu(d)=[n=1]\) 证明:我们把n分解质因数,则原式\(=(-1+1)^{\omega(n)}=0\). 因为对于不同的质因子,只有选和不选两种方案,这是一个组合数相加的形式,偶数加奇数减,根据二项式

莫比乌斯反演欧拉函数杜教筛大总结

莫比乌斯函数 定义 设\(n=\prod_{i=1}^{k} p_i^{c_i}\),则\(\mu(n)=(-1)^k\),特别地\(\mu(1)=1\). 性质 最常用性质 \(\sum_{d|n}\mu(d)=[n=1]\) 反演性质 \(F(n)=\sum_{d|n}f(d) \Longleftrightarrow f(n)=\sum_{d|n}F(d)\mu(\frac{n}{d})\) \(F(n)=\sum_{n|d}f(d) \Longleftrightarrow f(n)=\su

【BZOJ4805】欧拉函数求和(杜教筛)

[BZOJ4805]欧拉函数求和(杜教筛) 题面 BZOJ 题解 好久没写过了 正好看见了顺手切一下 令\[S(n)=\sum_{i=1}^n\varphi(i)\] 设存在的某个积性函数\(g(x)\) \[(g*\varphi)(i)=\sum_{d|i}g(d)\varphi(\frac{i}{d})\] \[\sum_{i=1}^n(g*\varphi(i))(i)\] \[=\sum_{i=1}^n\sum_{d|i}g(d)\varphi(\frac{i}{d})\] \[=\sum

BZOJ4805: 欧拉函数求和(杜教筛)

4805: 欧拉函数求和 Time Limit: 15 Sec  Memory Limit: 256 MBSubmit: 614  Solved: 342[Submit][Status][Discuss] Description 给出一个数字N,求sigma(phi(i)),1<=i<=N Input 正整数N.N<=2*10^9 Output 输出答案. Sample Input 10 Sample Output 32 HINT Source By FancyCoder 直接大力杜教筛