NOIP訓練營集訓筆記—基本數論(二)
本文作者潘愷璠參加過清北學堂NOIP2017訓練營提高組精英班,筆記非常詳細。特分享給大家!基本數論相關筆記較多,為方便大家閱讀,我們預計會分為三到四篇文章介紹給大家。
點擊一下標題可查看其他相關筆記!
NOIP訓練營集訓筆記—基本數論(一)
基本數論(二)
15.歐拉定理:
費馬小定理的推廣:aφ(m)≡1(mod m)。
補充一些同餘的性質:
①反身性:a≡a(mod m)
②對稱性:若a≡b(mod m),則b≡a(mod m)
③傳遞性:若a≡b(mod m),b≡c(mod m),則a≡c(mod m)
④同餘式相加:若a≡b(mod m),c≡d(mod m),則a±c≡b±d(mod m)
⑤同餘式相乘:若a≡b(mod m),c≡d(mod m),則ac≡bd(mod m)
經典例題:給定數a、b、p,求ax≡b(mod p)的最小正整數解x。
BSGS演算法——「北上廣深演算法」或「拔山蓋世演算法」:
令x=im-j,m=?sqrt(p)?,則aim-j≡b(mod p),
移項,有:(am)i≡baj(mod p)
首先,從0~m枚舉j,將得到的baj的值存入hash表;
然後,從1~m枚舉i,計算(am)j,查表,如果有值與之相等,則當時得到的im-j是最小值。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<cmath>
using namespace std;
long long a,b,c,m,f[10000000];
map<long long,int> mp;
long long qsm(long long x) //快速冪
{
long long sum=1;
long long aa=a;
while(x>0)
{
if(x&1)
sum=(sum*aa)%c;
x=x>>1;
aa=(aa*aa)%c;
}
return sum;
}
int main()
{
mp.clear();//刪除map中的所有元素。
while(scanf("%lld%lld%lld",&c,&a,&b)!=EOF)
{
mp.clear();
if(a%c==0)//判斷a,c 是否互質,因為c 是質數,所以直接判斷是否整除即可
{
printf("no solution
");
continue;
}
int p=false;
m=ceil(sqrt(c));
long long ans;
for(int i=0;i<=m;i++)
{
if(i==0)
{
ans=b%c;
mp[ans]=i;
continue;
}
ans=(ans*a)%c;
mp[ans]=i;
}
long long t=qsm(m);
ans=1;
for(int i=1;i<=m;i++)
{
ans=(ans*t)%c;
if(mp[ans])
{
int t=i*m-mp[ans];
printf("%d
",(t%c+c)%c);
p=true;
break;
}
}
if(!p)
{
printf("no solution
");
}
}
}
經典例題:求[l,r]之間的所有素數,1≤l≤r≤109,r-l≤105。
三個解法:
①Miller-Rabin
②線性篩
③SPOJ PRIME1
二、概率:
一些定義和推論:
①Pr[i]表示事件i發生的概率
②Pr[1]+Pr[2]+…Pr[N]=1
③xi表示事件i的權重(自己定義的權重)
④事件xi的期望E[xi]=Pr[i]×xi(i:1~N) 期望=概率×權重
⑤對於獨立事件i和j,Pr[i^j]=Pr[i]×Pr[j],事件i和j的期望是可加的
⑥當事件j已經發生時,事件i發生的概率為:Pr[i|j]=Pr[i^j]/Pr[j]
一個有趣的結論:當太陽已經從東邊升起N天后,第N+1天從東邊升起的概率:(N+1)/(N+2)。
1.Problem 1:
在小蔥和小澤面前有三瓶葯,其中有兩瓶是毒藥一瓶是可樂,每個人必須喝一瓶。
小蔥和小澤各自選了一瓶葯,小澤手速比較快將葯喝了下去,然後就掛掉了。
小蔥想活下去,他是應該喝掉手上這瓶葯,還是喝掉另外一瓶呢?
我們把瓶子編號為1、2、3,1、2號葯是毒藥,3號葯是可樂。
根據全排列的知識,我們列出6種情況:
1、2、3;1、3、2;
2、1、3;2、3、1;
3、1、2;3、2、1;
由於第一個人是被毒死了,所以只可能是1、2、3;1、3、2;2、1、3;2、3、1;這四種情況,我們發現第二個人喝的是解藥的概率為:Pr[是解藥]=(1+1)/4=50%。
更簡單的想法:小蔥選哪個都一樣,因為小蔥不知道哪個是毒藥哪個是可樂。
鍾神:顯然無所謂!
2.淺談瑪麗蓮問題:
美國某娛樂節目的舞台上,台上有三個門,其中一個門後邊有汽車,另外兩個門後邊是山羊,主持人讓你任意選擇其中一個,然後他打開其餘兩個門中的一個,你看到的是山羊,這時,主持人會讓你重新選擇,那麼你會堅持原來的選擇還是換選另外一個未被打開過的門呢?
分兩種情況討論:
①不換門:抽中汽車的概率是1/3。
②換門:我們編號三個門分別為1、2、3,分別對應羊、羊、車
情況1:假設你第一次猜的那個門是1,主持人必將打開2,選擇換門3必能得到車。
情況2:假設你第一次猜的那個門是2,主持人必將打開1,選擇換門3必能得到車。
情況3:假設你第一次猜的那個門是3,主持人會打開1或2,你會換1或2號門,得不到車。
綜上所述:換門抽中汽車的概率為2/3。
Pr(換門)>Pr(不換門),所以應該換門!
現在思考:同樣是二選一,為什麼概率會不同?
因為主持人知道哪個門是羊哪個門是車,上一題中小蔥不知道哪瓶是毒藥,因為主持人從中作祟,所以概率不同!
3.Problem 2:
小胡站在原點,手裡拿著兩枚硬幣。拋第一枚硬幣正面向上的概率為p,第二枚正面向上的概率為q。
小胡開始拋第一枚硬幣,每次拋到反面小胡就向x軸正方向走一步,直到拋到正面。
接下來小胡繼續拋第一枚硬幣,每次拋到反面小胡就向y軸正方向走一步,直到拋到正面。
現在小胡想回來了,於是他開始拋第二枚硬幣,如果小胡拋到正面就向x軸的負方向走一步,否則小胡就向y軸的負方向走一步。
現在小胡想知道他在往回走的時候經過原點的概率是多少?
根據定理:往x軸走k步的概率為(1-p)x×p,同理於y軸。
我們可以枚舉小胡在第一輪中走到的點(x,y)
小胡走到點(x,y)的概率為(1-p)x+y×p2(乘法原理)
小胡從點(x,y)走回原點的概率為qx×(1-q)y×[(x+y)!/(x!×y!)]。
說明:qx×(1-q)y表示前幾步都走x步,後幾步都走y步的概率,而實際情況是可以交替著走的,所以我們在後面乘上