1. 程式人生 > >51nod 1240 莫比烏斯函式

51nod 1240 莫比烏斯函式

莫比烏斯函式,由德國數學家和天文學家莫比烏斯提出。梅滕斯(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; }