Description

n<=1e9,M,K<=100

Solution

显然任选m个港口的答案是一样的,乘个组合数即可。

考虑枚举m个港口的度数之和D

可以DP计算

记\(F_{m,D}\)为将D的度数分给m个港口的方案数

枚举新的一个度数分配给谁,然后此时可能某一个超出了限制,减掉这一个的贡献。

接下来我们可以用一个超级根把D个点连起来

prufer序简单计数即可

\(n-m+1\)个点,其中超级根出现了\(D-1\)次

就是\({n-m-1\choose D-1}(n-m)^{n-m-D}\)

总的答案为$${n\choose m}\sum\limits_{i=0}^{mK}F_{m,i}{n-m-1\choose D-1}(n-m)^{n-m-D}$$

组合数取模的时候,我们先对模数分解质因子,每次组合数相当于乘一个数除一个数

暴力枚举质因子,剩下的部分就有逆元了

注意n=m的时候会有问题需要特判。

Code

#include <bits/stdc++.h>
#define fo(i,a,b) for(int i=a;i<=b;++i)
#define fod(i,a,b) for(int i=a;i>=b;--i)
const int N=105;
typedef long long LL;
using namespace std;
int t,n,m,num,l,mo,f[N][N*N],cs[N*N][N],pr[N][2];
LL ksm(LL k,LL n)
{
LL s=1;
for(;n;n>>=1,k=k*k%mo) if(n&1) s=s*k%mo;
return s;
}
void exgcd(LL a,LL b,LL &x,LL &y)
{
if(b==0) {x=1,y=0;return;}
exgcd(b,a%b,y,x);
y-=(a/b)*x;
}
LL ny(int k)
{
LL x,y;
exgcd(k,mo,x,y);
return (x%mo+mo)%mo;
}
void make(int n)
{
num=0;
int n1=sqrt(n);
fo(i,2,n1)
{
if(n%i==0)
{
pr[++num][0]=i;
while(n%i==0) pr[num][1]++,n/=i;
}
}
if(n>1) pr[++num][0]=n,pr[num][1]=1;
}
int pv[N];
void mul(LL &s,LL v)
{
if(v!=0) fo(i,1,num) while(v%pr[i][0]==0) v/=pr[i][0],pv[i]++;
s=s*v%mo;
}
void dvi(LL &s,LL v)
{
fo(i,1,num) while(v%pr[i][0]==0) v/=pr[i][0],pv[i]--;
s=s*ny(v)%mo;
}
LL get(LL s)
{
fo(i,1,num) s=s*ksm(pr[i][0],pv[i])%mo;
return s;
}
int main()
{
cin>>t;
while(t--)
{
scanf("%d%d%d%d",&n,&m,&l,&mo);
if(n==m) {printf("%d\n",1%mo);continue;}
cs[0][0]=1%mo;
make(mo);
fo(i,1,m*l)
{
cs[i][0]=1%mo;
int r=min(i,l);
fo(j,1,r) cs[i][j]=((LL)cs[i-1][j]+cs[i-1][j-1])%mo;
}
f[0][0]=1;
fo(i,1,m)
{
int r=min(i*l,n-m);
f[i][0]=1;
fo(j,1,r)
{
f[i][j]=(LL)f[i][j-1]*i%mo;
if(j>l) f[i][j]=(f[i][j]-(LL)cs[j-1][l]*f[i-1][j-1-l]%mo*i%mo+mo)%mo;
}
}
memset(pv,0,sizeof(pv));
LL v=1,ans=0;int r=min(n-m,l*m);
fo(i,1,r)
{
ans=(ans+ksm(n-m,n-i-m)*f[m][i]%mo*get(v)%mo)%mo;
mul(v,n-m-i),dvi(v,i);
}
v=1;memset(pv,0,sizeof(pv));
fo(j,0,m-1) mul(v,n-j),dvi(v,j+1);
ans=ans*get(v)%mo;
printf("%lld\n",ans);
}
}

[JZOJ6244]【NOI2019模拟2019.7.1】islands【计数】【图论】的更多相关文章

  1. [JZOJ6244]【NOI2019模拟2019.7.1】Trominoes 【计数】

    Description n,m<=10000 Solution 考虑暴力轮廓线DP,按顺序放骨牌 显然轮廓线长度为N+M 轮廓线也是单调的 1表示向上,0表示向右 N个1,M个0 只能放四种骨牌 ...

  2. 【NOI2019模拟2019.7.1】为了部落 (生成森林计数,动态规划)

    Description: \(1<=n<=1e9,1<=m,k<=100\) 模数不是质数. 题解: 先选m个点,最后答案乘上\(C_{n}^m\). 不妨枚举m个点的度数和D ...

  3. [JZOJ6247]【NOI2019模拟2019.6.27】C【计数】

    Description n<=200000 Solution 比赛时没做出这道题真的太弟弟了 首先我们从小到大插入数i,考虑B中有多少个区间的最大值为i 恰好出现的次数不太好计算,我们考虑计算最 ...

  4. [JZOJ6241]【NOI2019模拟2019.6.29】字符串【数据结构】【字符串】

    Description 给出一个长为n的字符串\(S\)和一个长为n的序列\(a\) 定义一个函数\(f(l,r)\)表示子串\(S[l..r]\)的任意两个后缀的最长公共前缀的最大值. 现在有q组询 ...

  5. 【NOI2019模拟2019.6.29】字符串(SA|SAM+主席树)

    Description: 1<=n<=5e4 题解: 考虑\(f\)这个东西应该是怎样算的? 不妨建出SA,然后按height从大到小启发式合并,显然只有相邻的才可能成为最优答案.这样的只 ...

  6. 【NOI2019模拟2019.6.29】组合数(Lucas定理、数位dp)

    Description: p<=10且p是质数,n<=7,l,r<=1e18 题解: Lucas定理: \(C_{n}^m=C_{n~mod~p}^{m~mod~p}*C_{n/p} ...

  7. 【NOI2019模拟2019.7.4】朝夕相处 (动态规划+BM)

    Description: 题解: 这种东西肯定是burnside引理: \(\sum置换后不动点数 \over |置换数|\) 一般来说,是枚举置换\(i\),则\(对所有x,满足a[x+i]=a[i ...

  8. 【NOI2019模拟2019.6.27】B (生成函数+整数划分dp|多项式exp)

    Description: \(1<=n,k<=1e5,mod~1e9+7\) 题解: 考虑最经典的排列dp,每次插入第\(i\)大的数,那么可以增加的逆序对个数是\(0-i-1\). 不难 ...

  9. 【NOI2019模拟2019.7.1】三格骨牌(轮廓线dp转杨图上钩子定理)

    Description \(n,m<=1e4,mod ~1e9+7\) 题解: 显然右边那个图形只有旋转90°和270°后才能放置. 先考虑一个暴力的轮廓线dp: 假设已经放了编号前i的骨牌,那 ...

随机推荐

  1. 查找担保圈-step3-获取担保圈路径

    USE [test] GO /****** Object: StoredProcedure [dbo].[p01_get_group_path] Script Date: 2019/7/8 14:40 ...

  2. celery 调用scrapy

    我的环境: celery 3.1.25 python 3.6.9 window10 celery tasks 代码如下,其中 QuotesSpider 是我的scrapy项目爬虫类名称 from ce ...

  3. 比反射更快!使用ASM获取class信息(ClassReader)

    比反射更快!使用ASM获取class信息(ClassReader) 通常我们想要在java运行时获取class的信息时,通常使用反射的方式来获取其中的属性,方法,注解等信息.通常是这样的: Class ...

  4. 手写Spring MVC

    闲及无聊 又打开了CSDN开始看一看有什么先进的可以学习的相关帖子,这时看到了一位大神写的简历装X必备,手写Spring MVC. 我想这个东西还是有一点意思的 就拜读了一下大佬的博客 通读了一遍相关 ...

  5. Luogu P2617 Dynamic Rankings(整体二分)

    题目 动态区间第K小模板题. 一个非常可行的办法是BIT套动态开点权值SegTree,但是它跑的实在太慢了. 然后由于这题并没有强制在线,所以我们可以使用整体二分来吊打树套树. 当然如果强制在线的话就 ...

  6. MySQL 中 savepoint 的使用

     介绍 savepoint 结点名; # 设置保存点,并和rollback结合使用,实现回滚到指定保存点 rollback to 结点名; # 回滚到指定点 样例演示 USE human; ; sta ...

  7. Jmeter 连接远程测压__(负载测试)

    第一步: 双方关闭防火墙  打开jmeter server bat   路径如下  会出错  

  8. 滚动页面产生动画WOW.js的用法

    简介 在一些网页上,当你滚动页面的时候会看到各式各样的元素动画效果,非常动感.WOW.js 就是一款帮助你实现这种 CSS 动画效果的插件.WOW.js 依赖 animate.css,所以它支持 an ...

  9. Linux实用命令及技巧

    1.  查看CPU及内存使用排行 1)查看当前CPU及内存的整体使用情况 top 2)可以使用以下命令查使用内存最多的10个进程 ps -aux | sort -k4nr | head -n 10 3 ...

  10. 如何看待yandex开源clickhouse这个列式文档数据库?

    如何看待yandex开源clickhouse这个列式文档数据库? 大数据云计算  water  5天前  24℃  0评论 欧阳辰<Druid实时大数据分析>作者,”互联居”作者编辑推荐1 ...