清北學堂Day5
阿新 • • 發佈:2017-10-05
自然 兩個 不為 除法 ... 結果 png ret prim
Part1--模擬題
今天上午的題……怎麽說呢,因為昨天晚上沒睡好,所以隨便搞了搞就睡覺了……emmm……而且今天的題有點偏數學,有找規律的,有概率的等等,感覺如果在noip中考的話,也應該是比較難我不會做的哪一類……所以……還是補覺比較實在。
Part2--今日專題:數論
今天應該是5天來聽得最痛苦的一天了。一方面是狀態也不好,另一方面,數論這個東西,本來就跟天書一樣。所以我挑了一些比較實(jian)用(dan)的部分記了下來。
1.模運算
快速冪:a^b%c
1 //快速冪(用乘法算冪) 2 int pow(int a,int b,int p) 3 { 4 if(b==0) return1%p; 5 int c=pow(a,b/2,p); 6 c=c*1LL*c%p; //轉long long 7 if(b&1) c=c*a%p; 8 return c; 9 } 10 int pow(int a,int b,int p) //另一種寫法 11 { 12 int ret=1%p; 13 while(b) 14 { 15 if(b&1) ret=ret*a%p; 16 b>>=1; 17 a=a*a%p; 18 } 19 returnret; 20 }
慢速乘
1 //慢速乘(用加法算乘) 2 int mul(int a,int b,int p) 3 { 4 int ret=0; 5 while(b) 6 { 7 if(b&1) ret=(ret+a)%p; 8 b>>=1; 9 a=(a+a)%p; 10 } 11 return ret; 12 }
2.素數 O(sqrt(n))來判斷素數 for i=2~sqrt(n)
算數基本定理,唯一分解定理:任何一個大於1的自然數N,如果N不為素數,那麽N可以唯一分解成有限個素數的乘積。
篩素數:(1)O(nlogn):埃式篩法
1 //篩素數O(nlogn):n/1+n/2+...+n/n=nlogn 2 bool vis[100000]; 3 for(int i=2;i<=n;i++) 4 { 5 if(!vis[i]) 6 { 7 for(int j=2;j*i<=n;j++) vis[j*i]=1; 8 } 9 }
(2)O(n)線性篩:
1 //線性篩素數O(n)***** 2 int mindiv[],prime[],tot; //mindiv最小素因子,prime記錄素數,tot記錄素數數量 3 for(int i=2;i<=n;i++) 4 { 5 if(!mindiv[i]) mindiv[i]=i,prime[tot++]=i; //得到素數 6 for(int j=0;prime[j]*i<=n;j++) 7 { 8 mindiv[prime[j]*i]=prime[j]; 9 if(prime[j]!=mindiv[i]) break; //a1>1 10 } 11 //a1==1 12 }
3.最大公約數
如果兩個數的最大公約數是1,則稱為‘互素’
輾轉相除法:
1 //輾轉相除 O(logn) 2 int gcd(int a,int b) //a,b的大小關系無所謂 3 { 4 return b==0?a:gcd(b,a%b); 5 }
4.費馬小定理:對於一個素數,他的額p-1次方是1
即,若p為素數,ap-1%p=1
證明:
%p能得到的所有結果:(0),1,2,3,…,p-1
每個數都*a à a,2a,3a,…,(p-1)a mod p
假設xa=ya(即有重復) mod p
xa-ya=0 mod p
a(x-y)=0 mod p X
因此證明沒有重復。 (然而證明並沒有什麽琴梨用)
5.Pick定理:一個計算頂點在格點上的多邊形面積公式
S=a+b/2-1
6.矩陣乘法
代碼實現:
1 Int a[][]; 2 3 Int b[][]; 4 5 Int c[][]; 6 7 For(int i=1;i<=n;i++) 8 9 For(int j=1;j<=n;j++) 10 11 For(int k=1;k<=n;k++) 12 13 C[i][j]+=a[i][k]*b[k][j];
用處:有些轉移方程或遞推式可以寫成矩陣模式(利用轉移矩陣)
嗯今天就這樣吧,實在是太難了/手動再見
清北學堂Day5