51nod 1240 莫比烏斯函式
阿新 • • 發佈:2019-01-05
莫比烏斯函式,由德國數學家和天文學家莫比烏斯提出。梅滕斯(Mertens)首先使用μ(n)(miu(n))作為莫比烏斯函式的記號。(據說,高斯(Gauss)比莫比烏斯早三十年就曾考慮過這個函式)。
具體定義如下:
如果一個數包含平方因子,那麼miu(n) = 0。例如:miu(4), miu(12), miu(18) = 0。
如果一個數不包含平方因子,並且有k個不同的質因子,那麼miu(n) = (-1)^k。例如:miu(2), miu(3), miu(30) = -1,miu(1), miu(6), miu(10) = 1。
給出一個數n, 計算miu(n)。
Input
輸入包括一個數n,(2 <= n <= 10^9)
Output
輸出miu(n)。
Input示例
5
Output示例
-1
莫比烏斯反演在數論中佔有重要的地位,許多情況下能大大簡化運算。那麼我們先來認識莫比烏斯反演公式。
定理:和是定義在非負整數集合上的兩個函式,並且滿足條件,那麼我們得到結論
在上面的公式中有一個函式,它的定義如下:
(1)若,那麼
(2)若,均為互異素數,那麼
(3)其它情況下
對於函式,它有如下的常見性質:
(1)對任意正整數有
(2)對任意正整數有
在本題中只要分一下類討論即可:
(1)如果這個數n能整除某個數的平方,那麼函式值就為0;
(2)否則判斷它的因子個數(k)的奇偶性,函式值為(-1)^k;
#include<iostream>
using namespace std;
int main()
{
int n;
while(cin>>n)
{
int blag=0,cnt=1;
for(int i=2;i*i<=n;i++)
{
if(n%i==0) //碰到因子
{
n/=i;
cnt++; //記下因子個數
if(n%i==0 ) //判斷能不能整除因子平方
blag=1;
}
if(blag)
break;
}
if(blag) //如果能整除因子平方,函式值為0
cout<<"0"<<endl;
else
{
if(cnt%2) //如果因子個數為奇數則函式值為-1
cout<<"-1"<<endl;
else //如果因子個數為偶數則函式值為1
cout<<"1"<<endl;
}
}
return 0;
}