莫比乌斯函数及反演

对 于 一 个 数 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} nnn=p1k1p2k2pmkm
我们定义莫比乌斯函数:
若 n = = 1 , u ( n ) = 1 若n==1,u(n) = 1 n==1,u(n)=1
若 对 于 任 意 的 k i = = 1 , u ( n ) = ( − 1 ) m 若对于任意的k_i == 1,u(n) = (-1)^m ki==1,u(n)=(1)m
若 存 在 k i > 1 , u ( n ) = 0 若存在k_i>1,u(n) = 0 ki>1,u(n)=0

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

vector 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) 1f(n)=dng(d),g(n)=dnu(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) 2f(n)=ndg(d),g(n)=ndu(d)f(d/n)

你可能感兴趣的:(数论)