当前位置: 首页 > news >正文

[BZOJ 2142]礼物(扩展Lucas定理)

Description

一年一度的圣诞节快要来到了。每年的圣诞节小E都会收到许多礼物,当然他也会送出许多礼物。不同的人物在小E心目中的重要性不同,在小E心中分量越重的 人,收到的礼物会越多。小E从商店中购买了n件礼物,打算送给m个人,其中送给第i个人礼物数量为wi。请你帮忙计算出送礼物的方案数(两个方案被认为是 不同的,当且仅当存在某个人在这两种方案中收到的礼物不同)。由于方案数可能会很大,你只需要输出模P后的结果。

Solution

扩展Lucas的板子题

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
typedef long long LL;
LL Mod,n,m,w;
LL read()
{
    LL x=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
}
LL pow(LL a,LL n,LL p)
{
    LL res=1;
    while(n)
    {
        if(n&1)res=(res*a)%p;
        a=(a*a)%p,n>>=1;
    }
    return res;
}
void exgcd(LL a,LL b,LL &d,LL &x,LL &y)
{
    if(!b)d=a,x=1,y=0;
    else exgcd(b,a%b,d,y,x),y-=x*(a/b);
}
LL inv(LL a,LL p)
{
    LL d,x,y;exgcd(a,p,d,x,y);
    return (x+p)%p==0?p:(x+p)%p;
}
LL fac(LL n,LL p,LL pk)
{
    if(n==0)return 1;
    LL res=1;
    for(LL i=2;i<=pk;i++)
        if(i%p)res=(res*i)%pk;
    res=pow(res,n/pk,pk);
    for(LL i=2;i<=n%pk;i++)
        if(i%p)res=(res*i)%pk;
    return (res*fac(n/p,p,pk))%pk;
}
LL C(LL n,LL m,LL p,LL pk)
{
    if(n<m)return 0;
    LL a=fac(n,p,pk),b=fac(m,p,pk),c=fac(n-m,p,pk);
    LL k=0;
    for(LL i=n;i;i/=p)k+=i/p;
    for(LL i=m;i;i/=p)k-=i/p;
    for(LL i=n-m;i;i/=p)k-=i/p;
    LL res=(((a*inv(b,pk))%pk)*inv(c,pk))%pk*pow(p,k,pk)%pk;
    return res*(Mod/pk)%Mod*inv(Mod/pk,pk)%Mod;
}
LL Lucas(LL n,LL m)
{
    LL res=0,P=Mod;
    for(LL i=2;i<=P;i++)
        if(P%i==0)
        {
            LL pk=1;
            while(P%i==0)P/=i,pk*=i;
            res=(res+C(n,m,i,pk))%Mod;
        }
    return res;
}
int main()
{
    Mod=read(),n=read(),m=read();
    LL ans=1;
    for(int i=1;i<=m;i++)
    {
        w=read();
        if(n<w){printf("Impossible");return 0;}
        ans=(ans*Lucas(n,w))%Mod;
        n-=w;
    }
    printf("%lld\n",ans);
    return 0;
}

 

转载于:https://www.cnblogs.com/Zars19/p/6993918.html

相关文章:

  • iOS UISlider的使用
  • CSS 各种形状
  • 用php 生成 excel 表格
  • .Net 路由处理厉害了
  • mybatis中批量插入以及更新
  • robots.txt的语法和写法详解
  • STL 标准模板库
  • Servlet 详解
  • I/O流
  • 菜鸟学习Redis(二)——Redis集群
  • 行为模式--代理Proxy模式(Java)
  • python 类的特殊成员
  • 修改敏感字
  • Java内部类
  • $.ajax中的eval及dataType
  • 《深入 React 技术栈》
  • 【附node操作实例】redis简明入门系列—字符串类型
  • Android开源项目规范总结
  • Debian下无root权限使用Python访问Oracle
  • docker python 配置
  • Java多态
  • JAVA多线程机制解析-volatilesynchronized
  • js中的正则表达式入门
  • Lsb图片隐写
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • Vue实战(四)登录/注册页的实现
  • 蓝海存储开关机注意事项总结
  • 使用Swoole加速Laravel(正式环境中)
  • 世界上最简单的无等待算法(getAndIncrement)
  • 我看到的前端
  • ​比特币大跌的 2 个原因
  • ​渐进式Web应用PWA的未来
  • ​批处理文件中的errorlevel用法
  • !!【OpenCV学习】计算两幅图像的重叠区域
  • #pragam once 和 #ifndef 预编译头
  • #stm32整理(一)flash读写
  • (30)数组元素和与数字和的绝对差
  • (floyd+补集) poj 3275
  • (Redis使用系列) Springboot 使用Redis+Session实现Session共享 ,简单的单点登录 五
  • (Spark3.2.0)Spark SQL 初探: 使用大数据分析2000万KF数据
  • (二)斐波那契Fabonacci函数
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)springboot课程在线考试系统 毕业设计 655127
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (转)Google的Objective-C编码规范
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .NET/C# 使用 #if 和 Conditional 特性来按条件编译代码的不同原理和适用场景
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • ??如何把JavaScript脚本中的参数传到java代码段中
  • @EnableWebMvc介绍和使用详细demo
  • [android] 请求码和结果码的作用
  • [Android]Android开发入门之HelloWorld
  • [AX]AX2012 AIF(四):文档服务应用实例
  • [BUUCTF 2018]Online Tool(特详解)
  • [C++][数据结构][算法]单链式结构的深拷贝