BZOJ 1951: [Sdoi2010]古代猪文 [Lucas定理 中国剩余定理]
生活随笔
收集整理的這篇文章主要介紹了
BZOJ 1951: [Sdoi2010]古代猪文 [Lucas定理 中国剩余定理]
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1951: [Sdoi2010]古代豬文
Time Limit:?1 Sec??Memory Limit:?64 MBSubmit:?2194??Solved:?919
[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 2Sample Output
2048HINT
10%的數據中,1 <= N <= 50;
20%的數據中,1 <= N <= 1000;
40%的數據中,1 <= N <= 100000;
100%的數據中,1 <= G <= 1000000000,1 <= N <= 1000000000。
1A太爽了!!!!!!
很簡單啊不想寫了我還要出題.......
[update 2017-02-16]
簡單說一下吧,本題沒必要用擴展Lucas,因為999911659分解質因子后是四個質數的乘積,直接單獨用Lucas然后CRT合并就行了。唯一不好的地方是命名有點困難....
答案很顯然,$G^{\sum\limits_{k|N}{N\choose k}}$
小心$G>P$導致不互質,不互質就是0啊(整除),所以g%P[0]然后快速冪的時候特判a==0
?
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> using namespace std; typedef long long ll; const int N=4e4+5; inline int read(){char c=getchar();int x=0,f=1;while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}return x*f; }int n,g; int P[5]={999911659,2,3,4679,35617}; int Pow(ll a,int b,int P){if(a==0) return 0;ll re=1;for(;b;b>>=1,a=a*a%P)if(b&1) re=re*a%P;return re; } int Inv(int a,int P){return Pow(a,P-2,P);} int inv[N][5],fac[N][5],facInv[N][5]; void ini(){for(int j=1;j<=4;j++){int MOD=P[j];inv[1][j]=fac[0][j]=facInv[0][j]=1;for(int i=1;i<=MOD;i++){if(i!=1) inv[i][j]=-MOD/i*inv[MOD%i][j]%MOD;if(inv[i][j]<0) inv[i][j]+=MOD;fac[i][j]=fac[i-1][j]*i%MOD;facInv[i][j]=facInv[i-1][j]*inv[i][j]%MOD;}} } inline int C(int n,int m,int j){int p=P[j];return fac[n][j]*facInv[m][j]%p*facInv[n-m][j]%p; } int lucas(int n,int m,int j){int MOD=P[0]-1,a=1,p=P[j];for(;m;m/=p,n/=p) a=a*C(n%p,m%p,j)%p;return (ll)a*(MOD/p)%MOD*Inv(MOD/p,p)%MOD; } ll Lucas(ll n,ll m){ll re=0,MOD=P[0]-1;for(int i=1;i<=4;i++)re=(re+lucas(n,m,i))%MOD;return re; } ll solve(){int m=sqrt(n);ll re=0;for(int i=1;i<=m;i++) if(n%i==0){//printf("hi %d\n",i);re=(re+Lucas(n,i))%(P[0]-1);//printf("Lucas %d\n",Lucas(n,i));if(i*i!=n) re=(re+Lucas(n,n/i))%(P[0]-1);//printf("hi %d\n",n/i); }return re; } int gcd(int a,int b){return b==0?a:gcd(b,a%b);} int main(){freopen("in","r",stdin);n=read();g=read();ini();//printf("solve %d\n",solve());printf("%d",Pow(g%P[0],solve(),P[0])); }?
總結
以上是生活随笔為你收集整理的BZOJ 1951: [Sdoi2010]古代猪文 [Lucas定理 中国剩余定理]的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法笔记_029:约瑟夫斯问题(Java
- 下一篇: 安卓开源项目周报0215