莫比乌斯函数及反演

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44316314/article/details/100022736

n n n = p 1 k 1 p 2 k 2 p m k m 对于一个数n,将n质因子分解得n = p_1^{k_1}*p_2^{k_2} \cdots *p_m^{k_m}
我们定义莫比乌斯函数:
n = = 1 , u ( n ) = 1 若n==1,u(n) = 1
k i = = 1 , u ( n ) = ( 1 ) m 若对于任意的k_i == 1,u(n) = (-1)^m
k i > 1 , u ( n ) = 0 若存在k_i>1,u(n) = 0

求1~n的莫比乌斯函数值:

vector<int> prime;
bool check[maxn+5];
int um[maxn+5]

void Mobius()
{
	mu[1] = 1;
	for (int i = 2; i <= maxn; i++)
	{
		if( !check[i] )
		{
			prime.push_back(i);
			um[i] = -1;    //质数的莫比乌斯值为-1 
		}
		for (int j = 0; j < prime.size(); j++)
		{
			if( i * prime[j] > maxn ) break;
			check[i*prime[j]] = true;
			if( i % prime[j] == 0 )
			{
				um[i*prime[j]] = 0;   //素因子分解后有prime[j]的指数大于1 
				break; 
			}else mu[i*prime[j]] = -mu[i];   //有一个新的素因子,且指数为1,乘-1 
		 } 
	}
}

莫比乌斯反演:
1 f ( n ) = d n g ( d ) , g ( n ) = d n u ( d ) f ( n / d ) 反演1:若f(n) = \sum_{d|n} g(d),则g(n) = \sum_{d|n} u(d)*f(n/d)
2 f ( n ) = n d g ( d ) , g ( n ) = n d u ( d ) f ( d / n ) 反演2:若f(n) = \sum_{n|d}g(d),则g(n) = \sum_{n|d}u(d)*f(d/n)

猜你喜欢

转载自blog.csdn.net/weixin_44316314/article/details/100022736
今日推荐