您的位置:首页 > 其它

HDU5446

2015-09-16 20:38 281 查看
http://blog.csdn.net/helloworld10086/article/details/48446457

这题解讲的超级好,我这数学白痴都明白了。。

#include<iostream>

#include<cstdio>

#include<string.h>

#include<string>

#include<stack>

#include<set>

#include<algorithm>

#include<cmath>

#include<vector>

#include<map>

#include<sstream>

#include<queue>

#define ll __int64

#define lll unsigned long long

#define MAX 1000009

#define MAXN 2009

#define eps 1e-8

#define INF 0x7fffffff

#define clr(a) memset(a,0,sizeof(a))

#define clr1(a) memset(a,-1,sizeof(a))

#define lson l , m , rt << 1

#define rson m + 1 , r , rt << 1 | 1

using namespace std;

inline ll Max(ll a,ll b)

{

return a>b?a:b;

}

inline ll Min(ll a,ll b)

{

return a<b?a:b;

}

ll fac[MAX];//因子

ll p[109];

ll lucas[109];

ll n,m,k;

ll modpow(ll a,ll b,ll mod)//a^b%mod

{

ll ret = 1;

while(b)

{

if(b&1) ret = (ret*a)%mod;

a = (a*a)% mod;

b>>=1;

}

return ret;

}

ll modmul(ll a,ll b,ll mod)//a*b%mod;

{

ll ret = 0;

while(b)

{

if(b&1) ret = (ret + a)%mod;

a = (a + a)% mod;

b>>=1;

}

return ret;

}

ll getFactor(ll p)//求因子

{

fac[0] = 1;

for(int i = 1;i<=p;i++)

{

fac[i] = (fac[i - 1]*i)%p;

}

}

ll Lucas(ll n,ll m,ll p)//大组合数取余

{

ll ret = 1;

while(n&&m)

{

ll a = n%p, b = m%p;

if(a<b) return 0;

ret = (ret*fac[a]*modpow(fac[b]*fac[a - b]%p , p - 2, p)) %p;

n/=p;

m/=p;

}

return ret;

}

ll exgcd(ll a,ll b,ll &x,ll &y)//拓展欧几里得

{

if(!b)

{

x = 1 , y = 0;

return a;

}

int ans = exgcd(b , a%b, y , x);

y-=a/b*x;

return ans;

}

ll CRT(ll *a,ll *m,int len)//中国剩余定理

{

ll d,x,y,ret = 0;

ll M = 1;

for(int i = 0;i < len;i++) M*=m[i];

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

{

ll w = M/m[i];

d = exgcd(m[i],w,x,y);

ret = (ret + modmul(modmul(y, w, M), a[i], M) ) % M;

}

return (ret + M) % M;

}

int main()

{

#ifdef ONLINE_JUDGE

#else

freopen("an.txt","r", stdin);

#endif

int T;

scanf("%d",&T);

while(T--)

{

scanf("%lld%lld%d",&n,&m,&k);

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

{

scanf("%I64d",&p[i]);

getFactor(p[i]);

lucas[i] = Lucas(n,m,p[i]);

}

ll ans = CRT(lucas,p,k);

printf("%I64d\n",ans);

}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: