[SDOI2010]古代猪文

link:

http://www.lydsy.com/JudgeOnline/problem.php?id=1951



题意:求t=∑C(n,i) [n%i==0],Ans=G^t


枚举因子O(sqrt(N))

指数循环节(费马小定理 mod-1)

Exgcd求逆元

因为N很大,用Lucas定理求C(N,i)

但是Lucas只能用于素数

要把mod-1拆成{2,3,4679,35617}的乘积

最后要用CRT合并

#include
#include
#include
#include
#include
#define maxn 100010
using namespace std;
typedef long long ll;
const ll mod=999911659;
const ll c[]={2,3,4679,35617};
ll N,G;
ll fac[maxn];
ll power_mod(ll x,ll y,ll mod){
	ll ans=1;
	while(y){
		if(y&1)ans=ans*x%mod;
		y>>=1;
		x=x*x%mod;
	}return ans%mod;
}
void Exgcd(ll a,ll b,ll& x,ll& y){
	if(!b){x=1,y=0;return;}
	Exgcd(b,a%b,y,x);
	y-=(a/b)*x;
}
ll inv(ll now,ll mod){
	ll x,y;
	Exgcd(now,mod,x,y);
	while(x<0)x+=mod;
	return x;
}
ll C(ll n,ll m,ll p){
	if(n




你可能感兴趣的:(BZOJ)