bzoj 2111: [ZJOI2010]Perm 排列计数 (dp+卢卡斯定理)

bzoj 2111: [ZJOI2010]Perm 排列计数

1 ≤ N ≤ 10^6, P≤ 10^9

题意:求1~N的排列有多少种小根堆

   1: #include<cstdio>
   2: using namespace std;
   3: const int N = 1e6+5;
   4: typedef long long LL;
   5: LL m, p, T, x, y, F[N];
   6: LL n, size[N<<1];
   7: LL f[N];
   8: LL inv(LL t, LL p) {
   9:     return t == 1 ? 1 : (p - p / t) * inv(p % t, p) % p;
  10: }
  11: LL C(LL n, LL m){
  12:     if(n < m) return 0;
  13:     if(n < p && m < p)
  14:         return F[n] * 1ll * inv(F[n-m]%p, p) % p * inv(F[m]%p, p) % p;
  15:     return C(n/p, m/p) * C(n%p, m%p) %p;
  16: }
  17: int main(){
  18:     int i;
  19:     scanf("%d%lld", &n, &p);
  20:     F[0] = 1;
  21:     for(i = 1; i <= n&&i < p; i++) F[i] = F[i-1] * i %p;//阶乘预处理
  22:     for(i = n; i; i--) {
  23:         size[i] = size[i<<1] + size[i<<1|1] + 1;
  24:         f[i] = C(size[i]-1, size[i<<1])*((i<<1)>n?1:f[i<<1])%p*((i<<1|1)>n?1:f[i<<1|1])%p;
  25:     }
  26:     printf("%lld\n", f[1]);
  27: }
posted @ 2017-07-26 09:58  GraceSkyer  阅读(174)  评论(0编辑  收藏  举报

~~~~~~ACM大牛语录,激励一下~~~~~~

为了世界的和平,为了女生的安全,我拼命做题,做题,做题!

用最短的时间,刷最多的题!

给我一滴泪,我就看到了你全部的海洋!

seize the hour, seize the day.

人生难免有无奈,幸福走远了,或是感叹幸福来迟了.其实我一直相信,无论手中的幸福是多么微不足道的感觉,我会把握住那每一分,每一秒,当幸福依旧像那百鸟般飞逝,终究无法掌握时,我会感谢它,曾经降临过!

A自己的题,让别人郁闷去吧

WA肠中过,AC心中留 TLE耳边过,AC特别牛

天然的悲苦和伤逝,过去有过,以后还会有

^*^一步一步往上爬^*^

AC就像练级,比赛就像PK. 练级不如PK好玩

其实,世上本没有ACM,AC的人多了,也便有了!

AC无止尽~ Seek you forever~

找呀找呀找水题,找到一个AC一个呀!

AC是检验程序的唯一标准。

真的猛士,敢于直面惨淡的人生,敢于正视淋漓的鲜血……