日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

BZOJ1951 [Sdoi2010]古代猪文 【费马小定理 + Lucas定理 + 中国剩余定理 + 逆元递推 + 扩展欧几里得】...

發(fā)布時間:2025/3/14 11 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BZOJ1951 [Sdoi2010]古代猪文 【费马小定理 + Lucas定理 + 中国剩余定理 + 逆元递推 + 扩展欧几里得】... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目

“在那山的那邊海的那邊有一群小肥豬。他們活潑又聰明,他們調皮又靈敏。他們自由自在生活在那綠色的大草坪,他們善良勇敢相互都關心……” ——選自豬王國民歌 很久很久以前,在山的那邊海的那邊的某片風水寶地曾經(jīng)存在過一個豬王國。豬王國地理位置偏僻,實施的是適應當時社會的自給自足的莊園經(jīng)濟,很少與外界聯(lián)系,商貿(mào)活動就更少了。因此也很少有其他動物知道這樣一個王國。 豬王國雖然不大,但是土地肥沃,屋舍儼然。如果一定要拿什么與之相比的話,那就只能是東晉陶淵明筆下的大家想象中的桃花源了。豬王勤政愛民,豬民安居樂業(yè),鄰里和睦相處,國家秩序井然,經(jīng)濟欣欣向榮,社會和諧穩(wěn)定。和諧的社會帶給豬民們對工作火紅的熱情和對未來的粉色的憧憬。 小豬iPig是豬王國的一個很普通的公民。小豬今年10歲了,在大肥豬學校上小學三年級。和大多數(shù)豬一樣,他不是很聰明,因此經(jīng)常遇到很多或者稀奇古怪或者旁人看來輕而易舉的事情令他大傷腦筋。小豬后來參加了全豬信息學奧林匹克競賽(Pig Olympiad in Informatics, POI),取得了不錯的名次,最終保送進入了豬王國大學(Pig Kingdom University, PKU)深造。 現(xiàn)在的小豬已經(jīng)能用計算機解決簡單的問題了,比如能用P++語言編寫程序計算出A + B的值。這個“成就”已經(jīng)成為了他津津樂道的話題。當然,不明真相的同學們也開始對他刮目相看啦~ 小豬的故事就將從此展開,伴隨大家兩天時間,希望大家能夠喜歡小豬。 題目描述 豬王國的文明源遠流長,博大精深。 iPig在大肥豬學校圖書館中查閱資料,得知遠古時期豬文文字總個數(shù)為N。當然,一種語言如果字數(shù)很多,字典也相應會很大。當時的豬王國國王考慮到如果修一本字典,規(guī)模有可能遠遠超過康熙字典,花費的豬力、物力將難以估量。故考慮再三沒有進行這一項勞豬傷財之舉。當然,豬王國的文字后來隨著歷史變遷逐漸進行了簡化,去掉了一些不常用的字。 iPig打算研究古時某個朝代的豬文文字。根據(jù)相關文獻記載,那個朝代流傳的豬文文字恰好為遠古時期的k分之一,其中k是N的一個正約數(shù)(可以是1和N)。不過具體是哪k分之一,以及k是多少,由于歷史過于久遠,已經(jīng)無從考證了。 iPig覺得只要符合文獻,每一種能整除N的k都是有可能的。他打算考慮到所有可能的k。顯然當k等于某個定值時,該朝的豬文文字個數(shù)為N / k。然而從N個文字中保留下N / k個的情況也是相當多的。iPig預計,如果所有可能的k的所有情況數(shù)加起來為P的話,那么他研究古代文字的代價將會是G的P次方。 現(xiàn)在他想知道豬王國研究古代文字的代價是多少。由于iPig覺得這個數(shù)字可能是天文數(shù)字,所以你只需要告訴他答案除以999911659的余數(shù)就可以了。

輸入格式

有且僅有一行:兩個數(shù)N、G,用一個空格分開。

輸出格式

有且僅有一行:一個數(shù),表示答案除以999911659的余數(shù)。

輸入樣例

4 2

輸出樣例

2048

提示

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。

題解

一句話題意:

ans=Gk|NC(N,k)mod999911659

真是神級題目,模數(shù)設計得十分巧妙,綜合了很多知識,需要處理的細節(jié)也很多

由于999911659是一個質數(shù),利用費馬小定理
ans=Gk|NC(N,k)mod99911658mod999911659

O(N??)枚舉出N的所有因子,逐一算出其組合數(shù)相加
N很大,計算組合數(shù)便十分棘手,不能直接算,考慮Lucas定理

但是Lucas定理要求模為素數(shù),999911658不滿足要求,我們將其因式分解,得到2,3,4679,35617,有很好的性質就是每個質因子都不大而且指數(shù)都為1

我們就可以分開算模每個因子的情況下的結果,最后用中國剩余定理總和到一起算出最后的結果

Lucas算組合數(shù)時可以先預處理各個模意義下的階乘和逆元階乘

最后要注意當G可能等于P,這時就是0啦。
如果直接算可能會出一個數(shù)據(jù)使得指數(shù)為0,這樣快速冪就會算出1來

#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #define LL long long int #define REP(i,n) for (int i = 1; i <= (n); i++) using namespace std; const int P = 999911659,PP = 999911658; LL N,G,ans[5]; LL prime[4]={2,3,4679,35617},f[4][35618],inv[4][35618]; void init(){for (LL i = 0; i < 4; i++){LL p = prime[i];f[i][0] = 1;for (LL j = 1; j < p; j++) f[i][j] = f[i][j - 1] * j % p;inv[i][1] = 1;for (LL j = 2; j < p; j++) inv[i][j] = (p - p / j) * inv[i][p % j] % p;inv[i][0] = 1;for (LL j = 1; j <= p; j++) inv[i][j] = inv[i][j] * inv[i][j - 1] % p;} } LL qpow(LL a,LL b,LL Mod){LL ans = 1;for (; b; b >>= 1,a = (LL)a * a % Mod)if (b & 1) ans = (LL)ans * a % Mod;return ans; } void exgcd(LL a,LL b,LL& d,LL& x,LL& y){if (!b) {x = 1; y = 0; d = a;}else exgcd(b,a % b,d,y,x),y -= (a / b) * x; } LL Lucas(LL n,LL m,LL i){if (n < m) return 0;if (n < prime[i] && m < prime[i]) return f[i][n] * inv[i][m] % prime[i] * inv[i][n - m] % prime[i];return Lucas(n % prime[i],m % prime[i],i) * Lucas(n / prime[i],m / prime[i],i) % prime[i]; } void cal(LL x){for (int i = 0; i < 4; i++)ans[i] = (ans[i] + Lucas(N,x,i)) % prime[i]; } LL China(){LL a,b,d,x,y,Ans = 0;for (LL i = 0; i < 4; i++){exgcd(a = PP / prime[i],b = prime[i],d,x,y);x = (x % PP * (PP / prime[i]) % PP + PP) % PP;Ans = (Ans + ans[i] * x % PP) % PP;}return (Ans % PP + PP) % PP; } int main(){//freopen("in.txt","r",stdin); //freopen("out1.txt","w",stdout); init();cin>>N>>G; LL i;if (G == P) {puts("0"); return 0;}for (i = 1; i * i < N; i++)if (N % i == 0) cal(i),cal(N / i);if (i * i == N) cal(i);ans[5] = qpow(G % P,China(),P);cout<<ans[5]<<endl;return 0; }

轉載于:https://www.cnblogs.com/Mychael/p/8282714.html

總結

以上是生活随笔為你收集整理的BZOJ1951 [Sdoi2010]古代猪文 【费马小定理 + Lucas定理 + 中国剩余定理 + 逆元递推 + 扩展欧几里得】...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。