BZOJ 3309 DZY Loves Math 莫比乌斯反演

题目大意:

枚举d=gcd(i,j),得到

现在我们只需要知道Σ[d|T]f(d)μ(T/d)的前缀和就行了 设这个函数为g(x)

观察这个函数 由于含平方因子数的μ值都为零,因此我们只考虑μ(T/d)!=0的数

令T=p1^a1*p2^a2*...*pk^ak,d=p1^b1*p2^b2*...*pk^bk

那么0<=(ai-bi)<=1

如果存在ai≠aj(i≠j),那么我们可以将所有的a分为两部分:最大的集合A和非最大的集合B

很显然f值由A中的选取方案决定

对于A中的每种选取方案,μ值决定于总选择的数量的奇偶性

在集合B中选取奇数个元素和偶数个元素的方案数是相等的,故对于A中的每种选取方案,得到的和都是0

故如果存在ai≠aj(i≠j),则g(T)=0

反之,如果所有的a值都相等,我们假设对于任意选取方案,f值都不变

那么由于选取奇数个元素和偶数个元素的方案数相等,和仍然为0

但是有一种选取方案的f值=a-1 因此我们要将这个1减掉

考虑到μ的符号之后,最终结果为(-1)^(k+1)

故如果不存在ai≠aj,则g(T)=(-1)^(k+1)

不知道说明白了没有。。。

求出g函数的方法是线性筛 对于每个值记录g值和最小质因数的次数 具体细节见代码

别忘了开long long

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define M 10001000
using namespace std;
int a[M],p_a[M],g[M],prime[1001001],tot;
bool not_prime[M];
void Linear_Shaker()
{
	int i,j;
	for(i=2;i<=10000000;i++)
	{
		if(!not_prime[i])
		{
			prime[++tot]=i;
			a[i]=1;
			p_a[i]=i;
			g[i]=1;
		}
		for(j=1;prime[j]*i<10000000;j++)
		{
			not_prime[prime[j]*i]=1;
			if(i%prime[j]==0)
			{
				a[prime[j]*i]=a[i]+1;
				p_a[prime[j]*i]=p_a[i]*prime[j];
				int temp=i/p_a[i];
				if(temp==1)
					g[prime[j]*i]=1;
				else
					g[prime[j]*i]=(a[temp]==a[prime[j]*i]?-g[temp]:0);
				break;
			}
			a[prime[j]*i]=1;
			p_a[prime[j]*i]=prime[j];
			g[prime[j]*i]=(a[i]==1?-g[i]:0);
		}
	}
	for(i=1;i<=10000000;i++)
		g[i]+=g[i-1];
}
long long Query(int n,int m)
{
	int i,last;
	long long re=0;
	if(n>m) swap(n,m);
	for(i=1;i<=n;i=last+1)
	{
		last=min(n/(n/i),m/(m/i));
		re+=(long long)(n/i)*(m/i)*(g[last]-g[i-1]);
	}
	return re;
}
int main()
{
	int T,a,b;
	Linear_Shaker();
	for(cin>>T;T;T--)
	{
		scanf("%d%d",&a,&b);
		printf("%lld\n",Query(a,b) );
	}
}
时间: 2024-11-07 01:03:37

BZOJ 3309 DZY Loves Math 莫比乌斯反演的相关文章

bzoj 3309 DZY Loves Math - 莫比乌斯反演 - 线性筛

对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b). Input 第一行一个数T,表示询问数. 接下来T行,每行两个数a,b,表示一个询问. Output 对于每一个询问,输出一行一个非负整数作为回答. Sample Input 4 7558588 9653114 6514903 445

【BZOJ】3309: DZY Loves Math 莫比乌斯反演优化

3309: DZY Loves Math Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0. 给定正整数a,b,求sigma(sigma(f(gcd(i,j)))) (i=1..a, j=1..b). Input 第一行一个数T,表示询问数. 接下来T行,每行两个数a,b,表示一个询问. Output 对于每一个询问,输出一行一个非负整数作为回答. Sample In

bzoj 3309 DZY Loves Math

LINK:DZY Loves Math 一道比较有意思的数论题 原谅我的智障多调了40min. 可以简单的推式子推出 答案为\(\sum{w=1}^n\frac{n}{w}\frac{m}{w}\sum{x|w}\mu(x)f(\frac{w}{x})\) f函数定义和题目中一致. 考虑后面前缀和怎么求 发现光求f(x)复杂度都比较高.如果我们把f(x)求出再调和级数预处理 那得GG 1e7过不了log+根号 考虑考虑一下\(\mu\)和f的这种形式肯定值有局限 设后面的东西为g(x) 不难发现

【bzoj3309】DZY Loves Math 莫比乌斯反演+线性筛

题目描述 对于正整数x,定义f(x)为x所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0.给定正整数n,m,求$\sum\limits_{i=1}^n\sum\limits_{j=1}^mf(\gcd(i,j))$ 输入 第一行一个数T,表示询问数.接下来T行,每行两个数n,m,表示一个询问. 输出 对于每一个询问,输出一行一个非负整数作为回答. 样例输入 4 7558588 9653114 6514903 445121

莫比乌斯反演 bzoj 3309 DZY Loves Math

好久没有写反演了 感觉不会了 首先推一个经典的式子啊 \[ans = \sum_{D=1}^{n}\sum_{d|D}f(d)\mu(\frac{D}{d})\frac{n}{D}\frac{m}{D}\] 记\(g(D) = \sum_{d|D}f(d)\mu(\frac{D}{d})\) 结论挺好找的啊 把一个数拆成\({p_k}^{a_k}\)形式 如果所有\(a_k\)相同 那么\(g(D) = (-1)^{k+1}\) 否则\(g(D) = 0\) 证明就考虑两个集合 所有次幂为最大的

bzoj 3309 DZY Loves Math——反演+线性筛

题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3309 像这种数据范围,一般是线性预处理,每个询问 sqrt (数论分块)做. 先反演一番.然后 f( ) 还不能一个就花 log 的时间,所以要分析性质. 设 n 一共 m 个质因数,其中最大的指数是 t . 已有 Σ(d|n) f(d)*u(n/d) ,如果 u( ) 的部分含有指数>=2的质因子,就无贡献:所以 u( ) 里每种质因数选1个或0个,一共 2^m 种. 如果 n 里有一个

bzoj 3560 DZY Loves Math V - 线性筛 - 数论 - 扩展欧几里得算法

给定n个正整数a1,a2,…,an,求 的值(答案模10^9+7). Input 第一行一个正整数n. 接下来n行,每行一个正整数,分别为a1,a2,…,an. Output 仅一行答案. Sample Input 3 6 10 15 Sample Output 1595 Hint 1<=n<=10^5,1<=ai<=10^7.共3组数据. 题目大意 (题目过于简洁,完全不需要大意) 题目虽然很简洁,但是处处挖着坑等你跳. 原计划两个小时把今天讲的例题A完,实际上两个小时都被这道题

BZOJ 3560 DZY Loves Math V 数论

题目大意:给定a1,a2,...,an,求 由于φ是积性函数,我们可以将i1i2...in分解质因数,对于每个质因数分开讨论,求积即可 将每个a分解质因数,假设分解后某个质数p在每个ai中的次数分别是bi,那么p对答案的贡献就是 于是对p^j维护一个前缀和,直接计算即可 #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define MOD 10000

bzoj 3512: DZY Loves Math IV

Description 给定n,m,求 模10^9+7的值. Solution 设 \(S(n,m)\) 表示 \(\sum_{i=1}^{m}\phi(n*i)\) \(Ans=\sum_{i=1}^{n}S(i,m)\) \(S(n,m)=\sum_{i=1}^{m}\phi(n*i)\) 如果 \(\mu(n)!=0\) 则有 \(\sum_{i=1}^{m}\phi(\frac{n}{gcd(i,n)})*\phi(i)*gcd(i,n)\) (因为要保证除完\(gcd\)之后,两数不含