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!}\)

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<iostream>
  4. #include<cmath>
  5. #include<iomanip>
  6. #include<cstring>
  7. #define R register
  8. #define EN printf("\n")
  9. #define LL long long
  10. inline LL read(){
  11. LL x=0,y=1;
  12. char c=getchar();
  13. while(c<'0'||c>'9'){if(c=='-') y=-1;c=getchar();}
  14. while(c>='0'&&c<='9'){x=x*10+(c^48);c=getchar();}
  15. return x*y;
  16. }
  17. int he[2000006],prime[2000006],cnt;//he[i]为i的最小质因子
  18. LL sum[2000006];
  19. inline void getprime(LL n){
  20. for(R int i=2;i<=n;i++){
  21. if(!he[i]) prime[++cnt]=i;
  22. for(R int j=1;j<=cnt&&i*prime[j]<=n;j++){
  23. he[prime[j]*i]=prime[j];
  24. if(!(i%prime[j])) break;
  25. }
  26. }
  27. }
  28. inline LL pow(LL a,LL b,LL p){
  29. LL ret=1;
  30. while(b){
  31. if(b&1) ret=(ret*a)%p;
  32. a=(a*a)%p;
  33. b>>=1;
  34. }
  35. return ret;
  36. }
  37. inline void fenjie(int x,int v){
  38. while(he[x]){
  39. sum[he[x]]+=v;
  40. x/=he[x];
  41. }
  42. if(x>1) sum[x]+=v;
  43. }
  44. inline LL C(LL n,LL k,LL p){
  45. memset(sum,0,sizeof sum);
  46. if(k>n) return 0;
  47. if(k==n) return 1%p;
  48. if(k==0) return 1%p;
  49. if(k==1) return n%p;
  50. LL ret=1;
  51. for(R int i=n-k+1;i<=n;i++) fenjie(i,1);
  52. for(R int i=1;i<=k;i++) fenjie(i,-1);
  53. for(R int i=2;i<=n;i++){
  54. if(sum[i]) ret=(ret*pow(i,sum[i],p))%p;
  55. }
  56. return ret;
  57. }
  58. int main(){
  59. LL ty=read(),n=read(),m=read(),p=read();
  60. LL space=n-m;
  61. getprime(n);
  62. LL jc=1;
  63. for(R int i=2;i<=m;i++) jc=(jc*i)%p;
  64. LL ans=C(space-1,m-2,p);
  65. ans=(ans+C(space-1,m-1,p)*2)%p;
  66. ans=(ans+C(space-1,m,p))%p;
  67. ans=(ans*jc)%p;
  68. printf("%lld",ans);
  69. return 0;
  70. }

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. go 错误处理与测试

    Go 没有像 Java 和 .NET 那样的 try/catch 异常机制:不能执行抛异常操作.但是有一套 defer-panic-and-recover 机制(参见 13.2-13.3 节). Go ...

  2. linux之进程管理(一)

    进程 定义 一个正在执行的程序 产生来源(仅针对linux中的进程) 通过fork复制一份与父进程一模一样的子进程.然后再以exec的方式执行实际需要执行的进程即 fork-and-exec 流程 从 ...

  3. 抓包工具fiddler安装和配置

    常见的抓包工具:fiddler.wireshark,本文以安装fiddler为例: 在官网上https://www.telerik.com/fiddler下载,安装后打开fiddler. 选择好自己的 ...

  4. C#多线程系列(1):Thread

    目录 1,获取当前线程信息 2,管理线程状态 2.1 启动与参数传递 2.1.1 ParameterizedThreadStart 2.1.2 使用静态变量或类成员变量 2.1.3 委托与Lambda ...

  5. 30.1 HashSet存储自定义对象 未去重解决

    问题: package day30_HashSet; import java.util.HashSet; /* * 通过hashset存储自定义对象,没有进行去重. * * */ public cla ...

  6. git获取特定的commit

    git reset --hard [commit_id]

  7. Java成长第四集--文本处理IO流

    Java IO流在实际业务中使用的频率还是蛮高的,一些业务场景比如,文件的上传和导出,文件的读取等基本都是通过操作IO流来实现的,所以IO流是我们现在学习过程中必须要掌握的技能之一,熟练的使用IO流, ...

  8. 【题解】LOJ2462完美的集合(树DP 魔改Lucas)

    [题解]LOJ2462完美的集合(树DP 魔改Lucas) 省选模拟考这个??????????????????? 题目大意: 有一棵树,每个点有两个属性,一个是重量\(w_i\)一个是价值\(v_i\ ...

  9. DES原理及代码实现

    一.DES基础知识DES技术特点 DES是一种用56位密钥来加密64位数据的方法    DES采取了分组加密算法:明文和密文为64位分组长度    DES采取了对称算法:加密和解密除密钥编排不同外,使 ...

  10. 从Generator入手读懂co模块源码

    这篇文章是讲JS异步原理和实现方式的第四篇文章,前面三篇是: setTimeout和setImmediate到底谁先执行,本文让你彻底理解Event Loop 从发布订阅模式入手读懂Node.js的E ...