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...