zoukankan      html  css  js  c++  java
  • bzoj 2142 礼物

    题目大意:

    $n$件礼物,送给$m$个人,其中送给第$i$个人礼物数量为$w_i$,求送礼物的方案数

    思路:

    显然答案为$inom{n}{w_1} inom{n-w_1}{w_2} cdots inom{n-w_1 ... w_{m-1}}{w_m}$

    化简得到$frac{n!}{w_1 ! w_2 ! cdots w_m! (n-sum)!}$

    然后扩展卢卡斯即可

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<cstdlib>
     5 #include<cmath>
     6 #include<algorithm>
     7 #include<queue>
     8 #include<vector>
     9 #include<map>
    10 #include<set>
    11 #define ll long long
    12 #define db double
    13 #define inf 2139062143
    14 #define MAXN 400100
    15 #define rep(i,s,t) for(register int i=(s),i##__end=(t);i<=i##__end;++i)
    16 #define dwn(i,s,t) for(register int i=(s),i##__end=(t);i>=i##__end;--i)
    17 #define ren for(register int i=fst[x];i;i=nxt[i])
    18 #define pb(i,x) vec[i].push_back(x)
    19 #define pls(a,b) ((a+b)%MOD+MOD)%MOD
    20 #define mns(a,b) ((a%MOD-(b)%MOD)%MOD+MOD)%MOD
    21 #define mul(a,b) (1LL*(a)*(b))%MOD
    22 using namespace std;
    23 inline int read()
    24 {
    25     int x=0,f=1;char ch=getchar();
    26     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
    27     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
    28     return x*f;
    29 }
    30 int n,m,a[10],ans,MOD;
    31 int exgcd(int a,int b,int &x,int &y)
    32 {
    33     if(!b) {x=1,y=0;return a;}
    34     int d=exgcd(b,a%b,y,x);y-=(a/b)*x;return d;
    35 }
    36 int q_pow(int bas,int t,int p,int res=1) 
    37 {
    38     for(;t;t>>=1,bas=(1LL*bas*bas)%p) if(t&1) res=(1LL*res*bas)%p;return res;
    39 }
    40 int inv(int n,int p){int x,y;exgcd(n,p,x,y);return (x+p)%p;}
    41 int fac(int n,int p,int pk)
    42 {
    43     if(!n) return 1;int res=1;
    44     rep(i,2,pk) if(i%p) res=(1LL*res*i)%pk;res=q_pow(res,n/pk,pk);
    45     rep(i,2,n%pk) if(i%p) res=(1LL*res*i)%pk;return (1LL*res*fac(n/p,p,pk))%pk;
    46 }
    47 int work(int p,int pk)
    48 {
    49     int res=fac(n,p,pk),s=0;for(int i=n;i;i/=p) s+=i/p;
    50     rep(i,1,m) {for(int j=a[i];j;j/=p) s-=j/p;res=mul(res,inv(fac(a[i],p,pk),pk));}
    51     return mul(q_pow(p,s,pk),res);
    52 }
    53 void exlucas()
    54 {
    55     int rst=MOD,pk;rep(i,2,sqrt(MOD)) if(rst%i==0)
    56     {
    57         pk=1;while(rst%i==0) rst/=i,pk*=i;
    58         ans=pls(mul(mul(work(i,pk),inv(MOD/pk,pk)),MOD/pk),ans);
    59     }
    60     if(rst!=1) ans=pls(mul(mul(work(rst,rst),inv(MOD/rst,rst)),MOD/rst),ans);
    61     printf("%d
    ",ans);
    62 }
    63 int main()
    64 {
    65     MOD=read();n=read(),m=read();int s=0;rep(i,1,m) a[i]=read(),s+=a[i];
    66     if(s>n)puts("Impossible");else {if(n-s) a[++m]=n-s;exlucas();}
    67 }
    View Code
  • 相关阅读:
    基于TFTP协议的远程升级设计
    BZOJ 刷题记录 PART 6
    解决org.hibernate.LazyInitializationException: could not initialize proxy
    在不同版本号hdfs集群之间转移数据
    从零開始制作H5应用(4)——V4.0,增加文字并给文字加特效
    不再安全的 OSSpinLock
    @synchronized 再考察
    ReactiveCocoa
    怎样界定问题
    问题是什么
  • 原文地址:https://www.cnblogs.com/yyc-jack-0920/p/10656378.html
Copyright © 2011-2022 走看看