P2480 SDOI2010 古代豬文

2022-02-27 09:24:16 字數 1742 閱讀 1617

p2480 [sdoi2010]古代豬文

比較綜合的一題

前置:lucas 定理,crt

求的是:

\[g^x\bmod 999911659,\textx=\sum_\tbinom

\]由於這個\(999911659\)是質數,肯定於\(g\)互質,所以由尤拉定理很容易證明:

\[a^\equiv 1\pmod p\rightarrow a^\equiv a^k\pmod p

\]那麼可以得出:

\[g^x\bmod 999911659\equiv g^\pmod

\]\[g^x\bmod 999911659\equiv g^\pmod

\]所以問題轉換為求:

\[\sum_\tbinom\bmod 999911658

\]這種大組合數的問題考慮用 lucas,但是模數太大,且不是質數

所以考慮將它分解:\(999911658=2\times 3\times 4679\times 35617\)

那麼,只需要對每乙個質因數,求出\(a\equiv \sum_\tbinom\bmod p_i\),然後再用 crt 合併就行了

算的時候,列舉每乙個\(i\le \sqrt n\),如果\(i\mid n\),則計算\(\tbinom\)和\(\tbinom}\)加到答案裡

但是,在這種因數不能重複計算的時候,要:

for(reg int i=1;i*i<=n;i++)
而不是

for(reg int i=1;i<=std::ceil(std::sqrt(n));i++)
對於後一種,舉個栗子:\(\lceil\sqrt \rceil=21\),但是如果\(i\)一直列舉到\(21\),就會在\(i=20,i=21\)的時候算兩次\(20,21\)這兩個因數,重複了,出現錯誤

還有,因為每次的計算模數不同,所以要分別預處理

#include#include#include#include#include#include#include#define reg register

#define en std::puts("")

#define ll long long

inline int read()

while(c>='0'&&c<='9')

return y?x:-x;

}const int prime[4]=;

int fac[40006],inv[40005];

inline int power(int a,int b,int p)

return ret;

}inline void pre(int n,int mod)

inline int get_c(int n,int m,int mod)

inline int lucas(int n,int m,int mod)

int main()

// std::printf("now ans = %d\n",nowans);

// for(reg int i=0;imi=m/prime[o];

t=power(mi,prime[o]-2,prime[o]);//t=mi^ mod prime[o]

ans=(ans+((ll)nowans*mi%m*t%m))%m;

} std::printf("%d",power(g,ans,m+1));

return 0;

}

SDOI2010 古代豬文

題目背景 在那山的那邊海的那邊有一群小肥豬。他們活潑又聰明,他們調皮又靈敏。他們自由自在生活在那綠色的大草坪,他們善良勇敢相互都關心 選自豬王國民歌 很久很久以前,在山的那邊海的那邊的某片風水寶地曾經存在過乙個豬王國。豬王國地理位置偏僻,實施的是適應當時社會的自給自足的莊園經濟,很少與外界聯絡,商貿...

SDOI 2010 古代豬文

一句話題意 設 x sum c n d 求 g x pmod 從原題面大段語文中其實不難推出所求。以前一不敢碰.今天做做發現是個水題 顯然問題在指數上,而不是整個式子。暴力檢驗一下,發現模數為質數。根據費馬小定理,a k equiv a pmod 所以所求化為 sum c d pmod woc怕不是...

題解 SDOI2010 古代豬文

原題傳送門 poi和pku是真的流批 這是一篇晚來十年的題解.洛谷 題目太長,這裡直接給出 演算法競賽高階指南 的題面 給定整數 q,n 1 leqslant q,n leqslant 10 9 計算 q c n d mod 而這到題裡,我們用 g 表示 q 首先給出乙個特例 當 g 9999116...