Codeforces Round #663 (Div. 2) C. Cyclic Permutations (构造,图?)
2024-09-05 09:13:49
题意:对于某个序列,若\(1\le i\le n\),\(1\le j\le i\)且\(p_j>p_i\),或者\(1\le i\le n\),\(i<j \le n\)且\(p_j>p_i\),那么就可以在\(i\)和\(j\)之间连一条边,求有多少能够成环的长度为\(n\)的序列.
题解:对于长度为\(n\)的序列,也就是有\(n\)个点,那么要成环的话,边数必须\(\ge n\),所以我们要让能连的边数\(<n\),再思考一下,对于每个数,除了\(n\),对于\([1,n-1]\)范围的数,每个数都有比它大的数,所以最小的总边数一定是\(n-1\),再转换一下,也就是说,假如某个数的两边都有比它大的数,那么就一定会成环.直接求成环数可能不好求,我们用总情况\(n!\)-\(不能成环数\).如果一个序列不能成环,那么所有数的两边不可能有数都比它本身大,也就是不能有波谷,那么我们从\([1,n]\)从小到大依次放(保证两头小,中间大),每个数都有两种选择,放在最左侧或最右侧,最后一定会剩下一个数别无选择,所以总情况是\(2^{n-1}\),那么最后答案就是\(n!-2^{n-1}\)啦~~
代码:
int n; int main() {
//ios::sync_with_stdio(false);cin.tie(0);
scanf("%d",&n); ll sum=1;
for(int i=1;i<=n;++i){
sum=sum*i%mod;
}
ll tmp=1;
for(int i=1;i<n;++i){
tmp=tmp*2%mod;
} printf("%lld\n",(sum-tmp+mod)%mod); return 0;
}
最新文章
- C#设计模式-模板方法模式
- 一、Ubuntu14.04下安装Hadoop2.4.0 (单机模式)
- Java工程图标前面的红色叹号
- Virtual Box 杂记
- codevs1958 刺激
- Android之View和SurfaceView
- 【python】获取高德地图省市区县列表
- C# 获取打印机列表以及串口
- 让你分分钟读懂CPU架构及芯片厂商
- 针对初学者的A*算法入门详解(附带Java源码)
- asp.net实现手机号码归属地查询,代码如下
- C语言里的指针探析——type *name[] 在函数参数里面,是一个二维指针
- Arduino 串口篇 Arduino发送十六进制 send HEX via serial port RS232-to-USB to PC
- Python快速入门(2)
- HTTP2的新特性
- Hadoop问题:Incorrect configuration: namenode address dfs.namenode.rpc-address is not configured
- vue学习笔记3
- 校园生活app结对开发第二天
- springmvc 项目完整示例01 需求与数据库表设计 简单的springmvc应用实例 web项目
- DevExpress中GridControl的使用笔记(转)
热门文章
- mysql中的基本注入函数
- 【EXPDP】expdp/impdp数据泵远程导入导出
- React 入门-redux 和 react-redux
- Numpy的一些学习记录
- STL_常用的算法
- https://twistedmatrix.com/documents/current/core/howto/defer.html
- Go语言学习笔记(1)——顺序编程
- VMware vCenter 6.0 安装及群集配置介绍(转载)
- 通过spring statemmachine 自定义构建属于自己的状态机(两种方式)
- 数据中心网络技术新贵:VXLAN与园区网络虚拟化