51nod 1829(函数)

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1829

本题目相当于:
n个不同的小球,放入到m个可区分的盒子中,且盒子不能
够为空,问方案数?
根据第二类斯特林数.答案就是 m!S(n,m);
再进行变化得: i=0m(1)i(mi)nCmi.
Cnm=n!(nm)!m!

#include <stdio.h>
#include <iostream>
#include <math.h>
#include <algorithm>
#include <string.h>
#include <string>


using namespace std;
typedef long long int LL;
const int maxn=1000005,MOD=1e9+7;

int n,m,a[maxn],ans;
LL fac[maxn],inv[maxn],fac_inv[maxn];
LL Pow(LL a,int b)
{
    LL res=1;
    for(; b; b>>=1,a=a*a%MOD) if(b&1) res=(res*a)%MOD;
    return res;
}
LL C(int n,int m)
{
    return fac[n]*Pow(fac[n-m]*fac[m]%MOD,MOD-2)%MOD;
}

void init()
{
    fac[0]=1;
    for(int i=1; i<=1000000; i++) fac[i]=fac[i-1]*i%MOD;
    inv[1]=1;
    for(int i=2; i<=1000000; i++) inv[i]=(LL)(MOD-MOD/i)*inv[MOD%i]%MOD;
}
int main()
{
    init();
    scanf("%d%d",&n,&m);
    ans=0;
    for(int i=0,e=1; i<=m; i++,e*=-1)
        ans=(ans+e*Pow(m-i,n)*C(m,i)%MOD)%MOD;
    printf("%d\n",(ans+MOD)%MOD);
    return 0;
}


posted @   Code-dream  阅读(403)  评论(0编辑  收藏  举报
编辑推荐:
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
阅读排行:
· Windows桌面应用自动更新解决方案SharpUpdater5发布
· 我的家庭实验室服务器集群硬件清单
· C# 13 中的新增功能实操
· Supergateway:MCP服务器的远程调试与集成工具
· Vue3封装支持Base64导出的电子签名组件
点击右上角即可分享
微信分享提示