#include<iostream> #include<cstdio> #include<cstring> #include<string.h> #include<algorithm> #include<vector> #include<cmath> #include<stdlib.h> #include<time.h> #include<stack> #include<set> #include<map> #include<queue> using namespace std; #define rep0(i,l,r) for(int i = (l);i < (r);i++) #define rep1(i,l,r) for(int i = (l);i <= (r);i++) #define rep_0(i,r,l) for(int i = (r);i > (l);i--) #define rep_1(i,r,l) for(int i = (r);i >= (l);i--) #define MS0(a) memset(a,0,sizeof(a)) #define MS1(a) memset(a,-1,sizeof(a)) #define MSi(a) memset(a,0x3f,sizeof(a)) #define inf 0x3f3f3f3f #define lson l, m, rt << 1 #define rson m+1, r, rt << 1|1 typedef pair<int,int> PII; #define A first #define B second #define MK make_pair typedef __int64 ll; template<typename T> void read1(T &m) { T x=0,f=1;char ch=getchar(); while(ch<‘0‘||ch>‘9‘){if(ch==‘-‘)f=-1;ch=getchar();} while(ch>=‘0‘&&ch<=‘9‘){x=x*10+ch-‘0‘;ch=getchar();} m = x*f; } template<typename T> void read2(T &a,T &b){read1(a);read1(b);} template<typename T> void read3(T &a,T &b,T &c){read1(a);read1(b);read1(c);} template<typename T> void out(T a) { if(a>9) out(a/10); putchar(a%10+‘0‘); } const int N = 10005; int prime[N],check[N]; void getprime() { for(int i = 2;i < N;i++)if(!check[i]){ prime[i] = ++prime[0]; for(int j = i*i;j < N;j += i) check[j] = 1; } } int f[4000][N]; void init() { getprime(); for(int i = 2;i <= N;i++){ if(prime[i] == 0) continue; int id = prime[i]; f[id][0] = 1; for(int j = 1;j < N;j++) f[id][j] = f[id][j-1]*j%i; } } int pow_mod(int a,int n,int p) { int ans = 1; while(n){ if(n & 1) ans = ans*a%p; a = a*a%p; n >>= 1; } return ans; } int C(int n,int m,int p) { if(n < m) return 0; if(n == m) return 1; int id = prime[p]; int a = f[id][n],b = f[id][m]*f[id][n - m]%p; return a*pow_mod(b,p-2,p)%p; } int Lucas(int n,int m,int p) { if(m == 0) return 1; if(m == 1) return n%p; return C(n%p,m%p,p)*Lucas(n/p,m/p,p)%p; } int main() { init(); int n,m,p,kase = 1; while(scanf("%d%d%d",&n,&m,&p) == 3){ if(m <= n/2) m = n - m; int ans = Lucas(n + 1,m + 1,p); printf("Case #%d: %d\n",kase++,(ans + m)%p); } return 0; }
hdu 3944 DP? 组合数取模(Lucas定理+预处理+帕斯卡公式优化)
原文:http://www.cnblogs.com/hxer/p/5231900.html