BZOJ 1951 古代豬文

2022-05-13 11:25:58 字數 1338 閱讀 7274

link:

solution:

見過最長的數論題題面.......

一道數論的綜合題,求解:

\[g^ c_n^d}~mod~p\]

我們先看冪能否化簡,

由費馬小定理可知p−1

'>g

'>1

'>:

\begin \displaystyle ans &=  g^ c_n^d}~mod~p  \\  &=g^ c_n^d~mod~(p-1)}~mod~p  \end

對於化簡後的冪:

\[\sum_ c_n^d~mod~(p-1)\]

我們想到列舉每乙個n的約數,使用lucas定理求大組合數取模

但p-1=2*3*4679*35617,不是乙個質數

於是我們以每乙個質因子為模數算出最終的解

由於質因子之間是互質的,再用中華剩餘定理合併結果算出最小的\[\sum_ c_n^d\],即為\[\sum_ c_n^d~mod~(p-1)\]

code:

#include using namespacestd;

typedef long longll;

const int maxn=1e5+10;

const int mod=999911659;

int quick_pow(ll a,ll b,intp) //快速冪

returnret;

}int inv(ll a,int p) //求逆元

int g,n,fac[4][maxn],c[4];

int pri=;

int c(int n,int m,intp) //求組合數

int lucas(int n,int m,intp) //lucas定理

ll crt() //中國剩餘定理

intmain()

for(int i=0;i<4;i++)

for(int j=1;j*j<=n;j++)

if(n%j==0)

cout

}

review:

1、如果模數為質數,

利用費馬小定理對冪化簡

2、遇到大組合數取模  ------->   lucas定理

如果模數不為質數,質因數分解後分別求出結果再用中華剩餘定理合並,套路啊……

3、中華剩餘定理求解方法

(1)遞推式地兩兩求解

(2)根據推導出的結論直接求解:

\[x=(\sum\limits_^k c_i**inv(,mi))\%m\]

BZOJ1951 古代豬文

time limit 1 sec memory limit 64 mb submit 2735 solved 1160 submit status discuss 有且僅有一行 兩個數n g,用乙個空格分開。有且僅有一行 乙個數,表示答案除以999911659的餘數。4 22048 10 的資料中,...

bzoj 1951 Sdoi2010 古代豬文

求這個東西 g k nk cknm od999911659 這題就是把幾個模板弄在一起。首先尤拉定理 g k nk cknm od 999911659 m od999911659 g k nkck nmod 999911658mo d999911659 然後將999911658拆成2 3 4679 ...

BZOJ 1951 Sdoi2010 古代豬文

題意 給定g,n,求 ans g binom mod p 1 n,g 10 9,p 999911659。演算法 尤拉定理 組合數取模 lucas 中國剩餘定理 crt 題解 先考慮簡化冪運算,因為模數為素數,由尤拉定理可知g k g k p mod p,顯然g k p mod p可以用快速冪求解 但...