數論總結1(基礎數論)
一.進位計數制
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\)轉換成三進制後,
將三進制中的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.歐拉篩法(線性篩素數)
原理:?每個合數必有一個最小素因子,用這個因子篩掉合數。
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(基礎數論)