[bzoj2142]礼物——扩展卢卡斯定理

本文探讨了一道关于圣诞礼物分配的数学问题,利用卢卡斯定理来计算在特定条件下礼物分配的方案数。通过解析题目的背景设定,详细介绍了算法实现过程,包括使用拓展卢卡斯定理进行模意义下的组合数计算。

题目大意:

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

思路:

拓展卢卡斯定理的裸体,直接上模板即可。

#include<bits/stdc++.h>
 
#define REP(i,a,b) for(int i=a,i##_end_=b;i<=i##_end_;++i)
#define DREP(i,a,b) for(int i=a,i##_end_=b;i>=i##_end_;--i)
#define MREP(i,x) for(int i=beg[x],v;v=to[i],i;i=las[i])
#define debug(x) cout<<#x<<"="<<x<<endl
#define fi first
#define se second
#define mk make_pair
#define pb push_back
typedef long long ll;
 
using namespace std;
 
void File(){
    freopen("bzoj2142.in","r",stdin);
    freopen("bzoj2142.out","w",stdout);
}
 
template<typename T>void read(T &_){
    T __=0,mul=1; char ch=getchar();
    while(!isdigit(ch)){
        if(ch=='-')mul=-1;
        ch=getchar();
    }
    while(isdigit(ch))__=(__<<1)+(__<<3)+(ch^'0'),ch=getchar();
    _=__*mul;
}
 
const int maxn=1e5+10;
int m,tot;
ll n,p,w[maxn],d[maxn],a[maxn],c[maxn];
 
namespace ex{
    void exgcd(ll a,ll b,ll &x,ll &y){
        if(!b)x=1,y=0;
        else exgcd(b,a%b,y,x),y-=a/b*x;
    }
    ll inv(ll x,ll mod){
        ll a,b; exgcd(x,mod,a,b);
        return (a%mod+mod)%mod;
    }
}
 
ll qpow(ll x,ll y,ll mod){
    ll ret=1; x%=mod;
    while(y){
        if(y&1)ret=ret*x%mod;
        x=x*x%mod;
        y>>=1;
    }
    return ret;
}
 
ll Count(ll x,ll y){
    ll ret=0;
    while(x)ret+=x/y,x/=y;
    return ret;
}
 
ll Fac(ll x,ll y,ll mod){
    if(!x)return 1;
    ll ret=1;
    REP(i,1,mod)if(i%y)ret=ret*i%mod;
    ret=qpow(ret,x/mod,mod);
    REP(i,1,x%mod)if(i%y)ret=ret*i%mod;
    return Fac(x/y,y,mod)*ret%mod;
}
 
ll calc(ll x,ll y){
    ll ret=0;
    REP(i,1,tot){
        c[i]=qpow(d[i],Count(x,d[i])-Count(y,d[i])-Count(x-y,d[i]),a[i]);
        c[i]=c[i]*Fac(x,d[i],a[i])%a[i];
        c[i]=c[i]*ex::inv(Fac(y,d[i],a[i])*Fac(x-y,d[i],a[i])%a[i],a[i]);
        ret=(ret+p/a[i]*ex::inv(p/a[i],a[i])*c[i])%p;
    }
    return (ret+p)%p;
}
 
void init(){
    read(p);
    read(n),read(m);
    ll sum=0;
    REP(i,1,m)read(w[i]),sum+=w[i];
    if(sum>n)printf("Impossible"),exit(0);
    ll tmp=p;
    REP(i,2,1e5)if(tmp%i==0){
        d[++tot]=i,a[tot]=1;
        while(tmp%i==0)tmp/=i,a[tot]*=i;
    }
}
 
void work(){
    ll ans=1;
    REP(i,1,m){
        ans=ans*calc(n,w[i])%p;
        n-=w[i];
    }
    printf("%lld\n",ans);
}
 
int main(){
    //File();
    init();
    work();
    return 0;
}


转载于:https://www.cnblogs.com/ylsoi/p/10098046.html

内容概要:本文介绍了ENVI Deep Learning V1.0的操作教程,重点讲解了如何利用ENVI软件进行深度学习模型的训练与应用,以实现遥感图像中特定目标(如集装箱)的自动提取。教程涵盖了从数据准备、标签图像创建、模型初始化与训练,到执行分类及结果优化的完整流程,并介绍了精度评价与通过ENVI Modeler实现一键化建模的方法。系统基于TensorFlow框架,采用ENVINet5(U-Net变体)架构,支持通过点、线、面ROI或分类图生成标签数据,适用于多/高光谱影像的单一类别特征提取。; 适合人群:具备遥感图像处理基础,熟悉ENVI软件操作,从事地理信息、测绘、环境监测等相关领域的技术人员或研究人员,尤其是希望将深度学习技术应用于遥感目标识别的初学者与实践者。; 使用场景及目标:①在遥感影像中自动识别和提取特定地物目标(如车辆、建筑、道路、集装箱等);②掌握ENVI环境下深度学习模型的训练流程与关键参数设置(如Patch Size、Epochs、Class Weight等);③通过模型调优与结果反馈提升分类精度,实现高效自动化信息提取。; 阅读建议:建议结合实际遥感项目边学边练,重点关注标签数据制作、模型参数配置与结果后处理环节,充分利用ENVI Modeler进行自动化建模与参数优化,同时注意软硬件环境(特别是NVIDIA GPU)的配置要求以保障训练效率。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值