P5520 【[yLOI2019] 青原樱】题解

整理博客的时候改了下分类标签,重新审一下

题目传送门

翻了翻题解区,发现基本没和我写的一样的(主要是都比我的写的简单

看题目:

第一眼,数学题;第二眼:组合数

接着想起来那道放苹果

n个位置,m棵树,就有n-m个空位,记space=n-m

转化问题为:

  1. space个空位插入m-1个位置(即左右两边都不留空)
  2. sapce个空位插入m个位置(即左边或右边留空,这种情况的答案要乘2)
  3. space个空位插入m+1个位置(即左右两边都留空位)

现在将space个空位看作space个苹果,m或m-1或m+1个位置看成盘子,因为每个位置(盘子)都要有至少一个空位(苹果),所以,这和放苹果就没什么区别了

运用一点隔板法解决:

以情况1为例: space个苹果间有space-1个间隔,因为要放进m-1个盘子,所以只需在space-1个间隔中选m-2个插入隔板,不重复不考虑顺序,所以:\(\tbinom {space-1} {m-2}\)

那么另外两种也就简单了,分别为:\(\tbinom {space-1} {m-1}\),\(\tbinom{space-1} {m}\)

考虑如何算组合数,发现p不一定为质数,所以对组合数计算的每个数分解,再约分

我用he数组表示一个数的最小质因子,为0说明不为合数

用sum数组记录每个质数的指数,是分子就加一,分母就减一

之后再快速幂乘起来

因为那m棵树是不同的,所以有m!种排列方式,也就是ans\(\times {m!}\)

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<iomanip>
#include<cstring>
#define R register
#define EN printf("\n")
#define LL long long
inline LL read(){
LL x=0,y=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-') y=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+(c^48);c=getchar();}
return x*y;
}
int he[2000006],prime[2000006],cnt;//he[i]为i的最小质因子
LL sum[2000006];
inline void getprime(LL n){
for(R int i=2;i<=n;i++){
if(!he[i]) prime[++cnt]=i;
for(R int j=1;j<=cnt&&i*prime[j]<=n;j++){
he[prime[j]*i]=prime[j];
if(!(i%prime[j])) break;
}
}
}
inline LL pow(LL a,LL b,LL p){
LL ret=1;
while(b){
if(b&1) ret=(ret*a)%p;
a=(a*a)%p;
b>>=1;
}
return ret;
}
inline void fenjie(int x,int v){
while(he[x]){
sum[he[x]]+=v;
x/=he[x];
}
if(x>1) sum[x]+=v;
}
inline LL C(LL n,LL k,LL p){
memset(sum,0,sizeof sum);
if(k>n) return 0;
if(k==n) return 1%p;
if(k==0) return 1%p;
if(k==1) return n%p;
LL ret=1;
for(R int i=n-k+1;i<=n;i++) fenjie(i,1);
for(R int i=1;i<=k;i++) fenjie(i,-1);
for(R int i=2;i<=n;i++){
if(sum[i]) ret=(ret*pow(i,sum[i],p))%p;
}
return ret;
}
int main(){
LL ty=read(),n=read(),m=read(),p=read();
LL space=n-m;
getprime(n);
LL jc=1;
for(R int i=2;i<=m;i++) jc=(jc*i)%p;
LL ans=C(space-1,m-2,p);
ans=(ans+C(space-1,m-1,p)*2)%p;
ans=(ans+C(space-1,m,p))%p;
ans=(ans*jc)%p;
printf("%lld",ans);
return 0;
}

P5520 【[yLOI2019] 青原樱】的更多相关文章

  1. 【组合数学】【P5520】[yLOI2019] 青原樱

    A [yLOI2019] 青原樱 Background 星川之下皆萤火尘埃 我独行在人潮你天真而待 相遇若是借丹青着色 青原上 绯樱如海 --银临<青原樱>(Cover 人衣大人) Des ...

  2. 洛谷P5520 【[yLOI2019] 青原樱】

    这题是小学奥数啊. 题意:求\(m\)个不同物品两两不相邻的方案数. 直接排列组合. 我们可以减掉他们之间最少需要空出来的位数--\(m-1\)个空位 像这样,我们只用留\(m-1\)个空位放在每两个 ...

  3. asp.net MVC4——省市三级联动数据库

    数据库设计

  4. 通用js地址选择器

    用js实现通用的地址选择器,省份,城市,地区自动关联更新 点击下面查看详细代码: http://runjs.cn/code/s8sqkhcv 关键地址库代码: var addr_arr = new A ...

  5. java 随机生成身份证代码

    import java.util.Calendar; import java.util.Collection; import java.util.HashMap; import java.util.I ...

  6. 全国城市三级联动 html+js

    全国城市三级联动,没有css,所以屏幕的自适应必须自己想办法,手机端慎用(最好不要用,因为有些我也说不出的展示问题). html页面 <!DOCTYPE html> <html> ...

  7. 省市级联.net

    初学javascript,编译省市级联,使用json在一般处理程序中编译,利用ajax传递数据到web前台 <html xmlns="http://www.w3.org/1999/xh ...

  8. Android 三级联动选择城市+后台服务加载数据库

    技术渣,大家将就着看 首先我们需要一个xml数据保存到数据库,这里我从QQ下面找到一个loclist.xml文件 <CountryRegion Name="中国" Code= ...

  9. react 写的省市三级联动

    <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>Ba ...

随机推荐

  1. 从零开始实现放置游戏(十三)——实现战斗挂机(4)添加websocket组件

    前两张,我们已经实现了登陆界面和游戏的主界面.不过游戏主界面的数据都是在前端写死的文本,本章我们给game模块添加websocket组件,实现前后端通信,这样,前端的数据就可以从后端动态获取到了. 一 ...

  2. vscode如何安装eslint插件 代码自动修复

    ESlint:是用来统一JavaScript代码风格的工具,不包含css.html等. 方法和步骤: 通常情况下vue项目都会添加eslint组件,我们可以查看webpack的配置文件package. ...

  3. matplotlib 显示最后n条数据(可用于实时更新)

    2020-04-16 14:05:01 --Edit by yangray 按横轴刻度的种类不同,分为数值类刻度和日期类刻度. 数值类刻度 需求:x轴数据间隔为2,显示最后24条数据. #!/usr/ ...

  4. SQL基础系列(4)-性能优化建议

    10.1 连接查询表的顺序问题 SQLSERVER的解析器按照从右到左的顺序处理FROM子句中的表名,因此FROM子句中写在最后的表(基础表driving table)将被最先处理,在FROM子句中包 ...

  5. xxx 表 is marked as crashed and last (automatic?) repair 解决办法

    如上图出现 xxx 表 is marked xxxx   的问题 运维那说是因为数据库非正常停掉 时 刚好有数据正在写入 数据库 导致的问题,这个没多大影响,需要 执行命令修复数据库,至于命令是什么? ...

  6. Web开发与设计之Google兵器谱-Web开发与设计利器

    Web开发与设计之Google兵器谱-Web开发与设计利器 博客分类: Java综合 WebGoogleAjaxChromeGWT 笔者是个Java爱好者也是用Java进行web开发的工作者.平时笔者 ...

  7. PAS

    一.概念 二.安装 打开Delphi,在主菜单上选择Component,单击Install Component,出现图所示的对话框.有两个选择,装到已经存在的包里面和装到新的包里面.我们选择后者,单击 ...

  8. Ubuntu搭建Redis 集群

    1.源码编译 查看需要下载版本:http://download.redis.io/releases/ 本人保存路径:/usr/local/soft/ wget http://download.redi ...

  9. 不同目录有同名proto文件情况下,protoc生成.cc/.h

    首先先参考一下别人的博客,看完了,看懂了,再回过头来看我下面说的情况. 链接 https://blog.csdn.net/CAir2/article/details/78201572 但是这个也就是基 ...

  10. 测评软件Lemon教程

    Lemon 信息技术测评软件 目录 下载与安装 编译器配置 添加样例和选手 完成测评 1.下载与安装 万恶的 伟大的百度网盘: 链接: https://pan.baidu.com/s/1BfMhs_z ...