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