BZOJ-1951 古代猪文 (组合数取模Lucas+中国剩余定理+拓展欧几里得+快速幂)...
1951: [Sdoi2010]古代豬文
Time Limit: 1 Sec Memory Limit: 64 MB
Submit: 1573 Solved: 650
[Submit][Status][Discuss]
Description
“在那山的那邊海的那邊有一群小肥豬。他們活潑又聰明,他們調(diào)皮又靈敏。他們自由自在生活在那綠色的大草坪,他們善良勇敢相互都關(guān)心……” ——選自豬王國(guó)民歌 很久很久以前,在山的那邊海的那邊的某片風(fēng)水寶地曾經(jīng)存在過(guò)一個(gè)豬王國(guó)。豬王國(guó)地理位置偏僻,實(shí)施的是適應(yīng)當(dāng)時(shí)社會(huì)的自給自足的莊園經(jīng)濟(jì),很少與外界聯(lián)系,商貿(mào)活動(dòng)就更少了。因此也很少有其他動(dòng)物知道這樣一個(gè)王國(guó)。 豬王國(guó)雖然不大,但是土地肥沃,屋舍儼然。如果一定要拿什么與之相比的話,那就只能是東晉陶淵明筆下的大家想象中的桃花源了。豬王勤政愛(ài)民,豬民安居樂(lè)業(yè),鄰里和睦相處,國(guó)家秩序井然,經(jīng)濟(jì)欣欣向榮,社會(huì)和諧穩(wěn)定。和諧的社會(huì)帶給豬民們對(duì)工作火紅的熱情和對(duì)未來(lái)的粉色的憧憬。 小豬iPig是豬王國(guó)的一個(gè)很普通的公民。小豬今年10歲了,在大肥豬學(xué)校上小學(xué)三年級(jí)。和大多數(shù)豬一樣,他不是很聰明,因此經(jīng)常遇到很多或者稀奇古怪或者旁人看來(lái)輕而易舉的事情令他大傷腦筋。小豬后來(lái)參加了全豬信息學(xué)奧林匹克競(jìng)賽(Pig Olympiad in Informatics, POI),取得了不錯(cuò)的名次,最終保送進(jìn)入了豬王國(guó)大學(xué)(Pig Kingdom University, PKU)深造。 現(xiàn)在的小豬已經(jīng)能用計(jì)算機(jī)解決簡(jiǎn)單的問(wèn)題了,比如能用P++語(yǔ)言編寫(xiě)程序計(jì)算出A + B的值。這個(gè)“成就”已經(jīng)成為了他津津樂(lè)道的話題。當(dāng)然,不明真相的同學(xué)們也開(kāi)始對(duì)他刮目相看啦~ 小豬的故事就將從此展開(kāi),伴隨大家兩天時(shí)間,希望大家能夠喜歡小豬。 題目描述 豬王國(guó)的文明源遠(yuǎn)流長(zhǎng),博大精深。 iPig在大肥豬學(xué)校圖書(shū)館中查閱資料,得知遠(yuǎn)古時(shí)期豬文文字總個(gè)數(shù)為N。當(dāng)然,一種語(yǔ)言如果字?jǐn)?shù)很多,字典也相應(yīng)會(huì)很大。當(dāng)時(shí)的豬王國(guó)國(guó)王考慮到如果修一本字典,規(guī)模有可能遠(yuǎn)遠(yuǎn)超過(guò)康熙字典,花費(fèi)的豬力、物力將難以估量。故考慮再三沒(méi)有進(jìn)行這一項(xiàng)勞豬傷財(cái)之舉。當(dāng)然,豬王國(guó)的文字后來(lái)隨著歷史變遷逐漸進(jìn)行了簡(jiǎn)化,去掉了一些不常用的字。 iPig打算研究古時(shí)某個(gè)朝代的豬文文字。根據(jù)相關(guān)文獻(xiàn)記載,那個(gè)朝代流傳的豬文文字恰好為遠(yuǎn)古時(shí)期的k分之一,其中k是N的一個(gè)正約數(shù)(可以是1和N)。不過(guò)具體是哪k分之一,以及k是多少,由于歷史過(guò)于久遠(yuǎn),已經(jīng)無(wú)從考證了。 iPig覺(jué)得只要符合文獻(xiàn),每一種能整除N的k都是有可能的。他打算考慮到所有可能的k。顯然當(dāng)k等于某個(gè)定值時(shí),該朝的豬文文字個(gè)數(shù)為N / k。然而從N個(gè)文字中保留下N / k個(gè)的情況也是相當(dāng)多的。iPig預(yù)計(jì),如果所有可能的k的所有情況數(shù)加起來(lái)為P的話,那么他研究古代文字的代價(jià)將會(huì)是G的P次方。 現(xiàn)在他想知道豬王國(guó)研究古代文字的代價(jià)是多少。由于iPig覺(jué)得這個(gè)數(shù)字可能是天文數(shù)字,所以你只需要告訴他答案除以999911659的余數(shù)就可以了。
Input
有且僅有一行:兩個(gè)數(shù)N、G,用一個(gè)空格分開(kāi)。
Output
有且僅有一行:一個(gè)數(shù),表示答案除以999911659的余數(shù)。
Sample Input
4 2
Sample Output
2048
HINT
10%的數(shù)據(jù)中,1 <= N <= 50;
20%的數(shù)據(jù)中,1 <= N <= 1000;
40%的數(shù)據(jù)中,1 <= N <= 100000;
100%的數(shù)據(jù)中,1 <= G <= 1000000000,1 <= N <= 1000000000。
Source
Sdoi2010 Contest2
題解:
設(shè)指數(shù)為M,模數(shù)為P 則依據(jù)費(fèi)馬小定理可以進(jìn)行轉(zhuǎn)化:
G^M mod P = G^(M mod (P-1) ) ( G != P)
P-1不為質(zhì),所以拆成指數(shù),最后用中國(guó)剩余定理合并即可
code:
#include<iostream> #include<algorithm> #include<cstdio> #include<cstring> #include<cmath>using namespace std; int pp[4]={2,3,4679,35617};int G,N,P=999911659; int jc[4][50000]; int M[4];void exgcd(int a,int b,int &x,int &y) {if (b==0) {x=1;y=0;return;}exgcd(b,a%b,x,y);int tmp=x;x=y;y=tmp-a/b*y; }int quick_pow(long long a,int b,int p) {int ans=1;for(int i=b;i;i>>=1,a=(a*a)%p)if(i&1)ans=(ans*a)%p;return ans; }void cs() {jc[1][0]=jc[2][0]=jc[3][0]=jc[0][0]=1;for (int i=0; i<4; i++)for (int j=1; j<=pp[i]; j++)jc[i][j]=(jc[i][j-1]*j)%pp[i]; } int C(int n,int m,int p) {if (n<m) return 0;return jc[p][n]*quick_pow(jc[p][m]*jc[p][n-m],pp[p]-2,pp[p])%pp[p]; } int lucas(int n,int m,int p) {if (m==0) return 1;return C(n%pp[p],m%pp[p],p)*lucas(n/pp[p],m/pp[p],p)%pp[p]; }int china() {int a1,b1,a2,b2,a,b,c,x,y;a1=pp[0],b1=M[0];for(int i=1;i<4;i++){a2=pp[i],b2=M[i];a=a1;b=a2;c=b2-b1;exgcd(a,b,x,y);x=((c*x)%b+b)%b;b1=b1+a1*x;a1=a1*b;}return b1; }int work() {G%=P;for (int i=1; i*i<=N; i++){if (N%i==0){int tmp=N/i;for (int j=0; j<4; j++){if (tmp!=i)M[j]=(M[j]+lucas(N,i,j))%pp[j];M[j]=(M[j]+lucas(N,tmp,j))%pp[j];}}}printf("%d\n",quick_pow(G,china(),P)); }int main() {cs();scanf("%d%d",&N,&G);if (G==P) {puts("0");return 0;}work();return 0; }轉(zhuǎn)載于:https://www.cnblogs.com/DaD3zZ-Beyonder/p/5346199.html
總結(jié)
以上是生活随笔為你收集整理的BZOJ-1951 古代猪文 (组合数取模Lucas+中国剩余定理+拓展欧几里得+快速幂)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 10KV高压电缆的直流耐压究竟是多少?
- 下一篇: 汤家凤:九月前强化复习结束不了怎么办?