CF294C Shaass and Lights
题目大意:
有n盏灯,(0<=n<=1000),有m盏已经点亮,每次只能点亮与已经点亮的灯相邻的灯,求总方案数,答案对1e9+7取模
第一行:两个整数n,m表示灯的总数和已点亮的灯的数目 第二行m个数,表示已点亮的灯的编号
分析:
我们可以借助已经被点亮的灯作为分界点,找到若干个长度不为0的开区间。
对于两边都有开着的灯的区间,我们点亮它每次可以点亮最左边一盏或者最右边一盏,而最后一盏灯只有一种方法,所以点亮长度为len的区间的方案数为:2^(len-1)
特别地,对于两端的区间(一边有灯开着,一边是边界(1或者n)),只有一种方案数(顺着一路点下去)
根据乘法原理,可以先计算出ans*=2^(len2-1)2^(len-2-1)...2^(len(cnt-1)-1)注意开始的时候是i=2,最后一段是i=cnt-1;(最初最末两端算上是没有意义的)
但是由于点灯的时候可以交叉在每个区间内点灯,所以这样的ans还是少了很多。
所以我们重新这样考虑: 考虑将每个区间内考虑成颜色相同的len个球,不同区间球的颜色不同。每一个排列可以当做是一个指令,不同的合法的指令是不同的方案数。
容易知道最初的方案数为:(n-m)!我们将它处理成多重集合的排列,(n-m)!/len1!len2!...lencnt!。这样保证了每个区间内的同一种颜色的球的“单纯相对顺序”(只是这些球之间交换顺序)变化都算作是一种方案。
但是一个区间内,并不是一种方案,对于len的球数,可以有2^(len-1)种合法排列,利用乘法原理再将它们相乘,就可以得出正确的答案。
(需要:快速幂,乘方的乘法逆元) 附代码:
#include<bits/stdc++.h>
#define ll long long
#define int long long
using namespace std;
const int mod=1e9+;
const int N=;
int n,m;
int len[N];//区间长度;
ll fac[N];//阶乘;
ll ifac[N];//阶乘逆元;
ll qm(int x,int y)
{
ll base=x;
ll ans=;
while(y)
{
if(y&) ans=(ans*base)%mod;
base=(base*base)%mod;
y>>=;
}
return ans%mod;
}//快速幂
int cnt;
ll anss=;
int h[N];
signed main()
{
scanf("%lld%lld",&n,&m);
int last=;
int x;
for(int i=;i<=m;i++)
{scanf("%lld",&h[i]);}
sort(h+,h+m+);//注意,编号可能不是单调的。
len[++cnt]=h[]-last-;
for(int i=;i<=m;i++)
{
if(h[i]-h[i-]>) len[++cnt]=h[i]-h[i-]-;
}
len[++cnt]=n-h[m];
for(int i=;i<=cnt-;i++)
anss=(anss*qm(,len[i]-))%mod;//先处理2^len
fac[]=;
ifac[]=;
for(int i=;i<=n-m;i++)
fac[i]=(fac[i-]*i)%mod;//阶乘
ifac[n-m]=qm(fac[n-m],mod-)%mod;//费马小定理先算n-m
for(int i=n-m-;i>=;i--)
ifac[i]=(ifac[i+]*(i+))%mod;//递推算阶乘逆元
anss=(anss*fac[n-m])%mod;
for(int i=;i<=cnt;i++)
anss=(anss*ifac[len[i]])%mod;//多重集合排列处理
printf("%lld",anss%mod);
return ;
}
还有一种组合数学的思想,
就是利用乘法原理,每次乘上:在每次剩余的位置放上len个数的方案数。
友链:https://blog.csdn.net/qq_38538733/article/details/76409237
CF294C Shaass and Lights的更多相关文章
- CF294C Shaass and Lights(排列组合)
题目描述 There are n n n lights aligned in a row. These lights are numbered 1 1 1 to n n n from left to ...
- C. Shaass and Lights 组合数学
http://codeforces.com/contest/294/problem/C 把那个数组n分段了,那么有两类. 1.开头和端点那些,就是只有一端在开始的,这个时候,要开完这些灯,只能循序渐进 ...
- 【Cf #178 A】Shaass and Lights(组合数)
考虑两个灯之间的暗灯,能从左边或右边点亮两种顺序,而最左端或最右端只有一种点亮顺序. 先不考虑点灯顺序,总共有n - m个灯要点亮,对于连续的一段暗灯,他们在总的点灯顺序中的是等价的,于是问题就可以抽 ...
- OUC_OptKernel_oshixiaoxiliu_好题推荐
poj1112 Team Them Up! 补图二分图+dp记录路径codeforces 256A Almost Arithmetical Progression dp或暴力 dp[i][j] = d ...
- Codeforces Round #178 (Div. 2)
A. Shaass and Oskols 模拟. B. Shaass and Bookshelf 二分厚度. 对于厚度相同的书本,宽度竖着放显然更优. 宽度只有两种,所以枚举其中一种的个数,另一种的个 ...
- HDOJ 4770 Lights Against Dudely
状压+暴力搜索 Lights Against Dudely Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- [我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之灯光介绍Lights
[我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之灯光介绍Lights 既上一篇分享了中文字幕的摄像机介绍Cameras后,本篇分享一下第2个已完工的 ...
- poj1222 EXTENDED LIGHTS OUT 高斯消元||枚举
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 8481 Accepted: 5479 Description In an ...
- ACM: NBUT 1646 Internet of Lights and Switches - 二进制+map+vector
NBUT 1646 Internet of Lights and Switches Time Limit:5000MS Memory Limit:65535KB 64bit IO Fo ...
随机推荐
- taro之React Native 端开发研究
初步结论:如果想把 React Native 集成到现有的原生项目中,不能使用taro的React Native 端开发功能(目前来说不能实现,以后再观察). RN开发有2种模式: 1.一是原生A ...
- hdu 1263 水果 结构的排序+sort自定义排序
水果 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...
- 趟坑:使用pip安装TensorFlow
这几天在安装TensorFlow,看了很多教程,方法也试了几种. 最后还是用pip安装成功的,过程如下. 1.安装ubuntu后在 系统设置-软件与更新-附加驱动 里,更新N卡驱动. (N卡官网下载 ...
- JS 柯里化 (curry)
用 JS 理解柯里化 函数式编程风格,试图以函数作为参数传递(回调)和无副作用的返回函数(修改程序的状态). 很多语言采用了这种编程风格.JavaScript,Haskell,Clojure,Erla ...
- 运用PDO存储将图片、音频文件存入数据库
在数据库中创建表格的时候,有一个字段为image,用来保存图片,那么其类型就是blob,关于blob,百度百科是这样描述的 BLOB (binary large object),二进制大对象,是一个可 ...
- PAT 1022 D进制的A+B
https://pintia.cn/problem-sets/994805260223102976/problems/994805299301433344 输入两个非负10进制整数A和B(<=2 ...
- java List<String>的初始化
今天在处理生成excel的时候用到了java的list,但是需要直接赋值固定的几个变量,如果先初始化然后add的方法: List<String> name = new ArrayList( ...
- 文件IO流完成文件的复制(复杂版本主要用来演示各种流的用途,不是最佳复制方案哦)
package io; import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import j ...
- Java动态代理、XML、正则
15.1 动态代理 在之后学习Spring框架时,Spring框架有一大核心思想,就是AOP,(Aspact-Oriented-Programming 面向切面编程) 而AOP的原理就 ...
- BZOJ2821 作诗(分块)
和区间众数几乎一模一样的套路. // luogu-judger-enable-o2 #include<iostream> #include<cstdio> #include&l ...