1. 程式人生 > >數論總結1(基礎數論)

數論總結1(基礎數論)

周期 display clas ems inline 左右 最大值 沒有 時間

一.進位計數制

1.進制表示:

技術分享圖片

表示b進制下的n+1位數。

2.進制轉換:

進制向十進制轉換:
乘以基數並展開:
技術分享圖片

十進制向b進制轉換:
整數部分除以基數並倒取余數。
小數部分乘以基數,並順取整數部分
技術分享圖片

3.例題:

a.天平1:

一個天平,有N個重量未知的砝碼,砝碼重量可由你自由確定。
砝碼可任意放在天平的左右兩邊,但要求稱出從1到M之間所有的重量,
現給出\(N\)的值,請問M最大值為多少。
答案:\([0,3^N]\)。具體見下面解析。

b.天平2:

一個天平,砝碼分別為1g、3g、9g、27g、…、6561g…,
每個砝碼只有一個,要稱重的物品放在天平的左側,而砝碼允許放在天平的左右兩側。

已知一個物品的質量N (N≤108 ),問如何稱重?
_____________________________________________________________________
解析:
就是將\(N\)轉換成三進制後,
將三進制中的0、1、2三個狀態轉換成 0、1 、-1
具體的說,就是0和1不變,2變成-1後,其高一位加1。
例如:
\(N\)轉化為三進制後為{1,2,0,1} , 那麽對應的狀態為:{1,-1,-1,0,1}。
即三進制中的2是沒法直接稱量的,因為每個重量的砝碼只有一個,所以只能通過相減來處理。

c.天平3:

一個天平,砝碼分別為1g、3g、9g、27g、…、6561g…,每個砝碼只有一個,

要稱重的物品放在天平的左側,而砝碼只允許放在天平的右側。
將由這個系統可以稱出來的重量按從小到大的順序進行排列,
得到下列序列:1,3,4,9,10,...。問其中的第K個重量是多少?
_____________________________________________________________________
解析:仔細觀察就可以發現,將K轉化為二進制後,為1的即放置對應質量的三進制重量砝碼即可。

二.素數和合數

1.素數判定:

枚舉\(\sqrt{N}\)內的質因子即可。 時間復雜度\(O(\sqrt{N})\)

2.歐拉篩法(線性篩素數)

原理:?每個合數必有一個最小素因子,用這個因子篩掉合數。

實現代碼(篩出\([0,N]\)的素數):

void Prime(int N){    
       memset(isPrime,true,sizeof(isPrime));
       isPrime[0 ] = false ;  isPrime[1] = false ;
       for (int i = 2 ; i <= N ; i++){
             if ( isPrime[i] )prime[++ total] = i ;            //把素數記錄下來
             //遍歷已知素數表中比i的最小素因數小的素數,並篩去合數
             for(int j = 1 ; j <= total && i * prime[j] <= N ; j++){ 
                 isPrime[ i * prime[j] ] = false ;
                 if  (!( i % prime[j]))  break;                   //找到i的最小素因數
             }
      }
}

三.唯一分解定理

對任一整數\(a>1\),有\(a= p_1^{a_1}p_2^{a_2}…p_n^{a_n}\)
幾個比較重要的結論(證明都很顯然)。
技術分享圖片

四.歐拉函數

1.定義:

歐拉函數: \([1,n]\)中和\(n\)互素的元素個數 \(φ(n)\)
\[φ(n) = \Sigma_{i=1}^{n} [gcd(i,n) ==1]\]

2.性質:

  • <1> 如果\(n\)為某一素數\(p\),則\(φ(p)=p-1\)

  • <2> 如果\(n\)為某一素數\(p\)的冪次\(p^a\)\(φ(p^a)=(p-1)×p^{a-1}\)
    證明:\(φ(p^{a}) = φ(p^{a-1})*p = (p^a-1)*(1-\frac{1}{p})*p = (p-1)×p^{a-1}\)

  • <3> 歐拉函數是積性函數,即當\(gcd(m,n)=1\)\(f(mn)=f(m)*f(n)\)

  • <4> 歐拉函數計算公式:
    \(p_1^{a_1}×p_2^{a_2}×…×p_k^{a_k}\)為正整數n的素數乘積式,則

\[φ(n) =n×(1-\frac{1}{p_1}) ×(1-\frac{1}{p_2})×…×(1-\frac{1}{p_k})\]

3.歐拉函數線性篩

void eular(int n){
    for(int i=2;i<=n;i++){
        if (!IsPrime[i])prime[++cnt]=i,phi[i]=i-1;
        for(int j=1;j<=cnt;j++){
            if(prime[j]*i>n)break;
            Isprime[prime[j]*i]=1;
            if(i%prime[j]==0)
               {phi[i*prime[j]]=phi[i]*prime[j];  break;}       //p是x的約數
             else
               phi[i*prime[j]]=phi[i]*(prime[j]-1);         //p不是x的約數
        }
    }return;
} 

理解:
設P是素數,
若p是x的約數,則\(φ(x*p)=φ(x)*p\)
//沒有加項。
若p不是x的約數,則\(φ(x*p)=φ(x)*φ(p)=φ(x)*(p-1).\)
//加了一項,即\(φ(x*p) = φ(x)*p*(1-\frac{1}{p}) = φ(x)*(p-1);\)

例題:

例一:Poj 2773Happy 2006

給出一個數字\(M\) (\(1 \leq M \leq 10^6\)), 數字\(K\) (\(1 \leq K \leq 10^8\)).求與M互質的第K個數字
_____________________________________________________________________
解法1:
註意到若(a,m) = 1,那麽(a+m*k,m)=1
所以實際上與m互質的數分布是一個分塊區間。
以[1,m]為一個周期循環,此法常數要卡一卡。
______________________________________________________________________
解法2:
先二分這個值n,
然後檢查小於等於n且與m互質的數的個數。
先處理出m的因數,然後用\(φ(x)\)容斥即可。

例二:[SDOI2012]Longge的問題

求:\(∑gcd(i, N)\) , \((1\leq i \leq N)\) , 其中$0<N\leq 2^{32}
$ 。
解析:見博客:http://www.cnblogs.com/GuessYCB/p/8192826.html

數論總結1(基礎數論)