BZOJ1931 : [Shoi2007]Permutation 有序的计数
枚举LCP以及下一位变小成什么,统计出剩下的有几个可以在原位置。
然后枚举剩下的至少有几个在原位置,容斥计算答案。
时间复杂度$O(n^3)$。
#include<cstdio>
typedef long long ll;
const int N=70,B=10000,MAXL=30;
int n,i,j,a[N],b[N],v[N],fun;
inline int max(int a,int b){return a>b?a:b;}
struct Num{
int a[MAXL],len,fu;
Num(){len=1,fu=a[1]=0;}
Num operator+(Num b){
Num c;
c.len=max(len,b.len)+2;
int i;
for(i=1;i<=c.len;i++)c.a[i]=0;
if(fu==b.fu){
for(i=1;i<=len;i++)c.a[i]=a[i];
for(i=1;i<=b.len;i++)c.a[i]+=b.a[i];
for(i=1;i<=c.len;i++)if(c.a[i]>=B)c.a[i+1]++,c.a[i]-=B;
while(c.len>1&&!c.a[c.len])c.len--;
c.fu=fu;
}else{
bool flag=0;
if(len==b.len){
for(i=len;i;i--)if(a[i]!=b.a[i]){
if(a[i]>b.a[i])flag=1;
break;
}
}else{
if(len>b.len)flag=1;
}
if(flag){
for(i=1;i<=len;i++)c.a[i]=a[i];
for(i=1;i<=b.len;i++)c.a[i]-=b.a[i];
for(i=1;i<=c.len;i++)if(c.a[i]<0)c.a[i+1]--,c.a[i]+=B;
while(c.len>1&&!c.a[c.len])c.len--;
c.fu=fu;
}else{
for(i=1;i<=b.len;i++)c.a[i]=b.a[i];
for(i=1;i<=len;i++)c.a[i]-=a[i];
for(i=1;i<=c.len;i++)if(c.a[i]<0)c.a[i+1]--,c.a[i]+=B;
while(c.len>1&&!c.a[c.len])c.len--;
c.fu=b.fu;
}
}
return c;
}
Num operator-(Num b){
b.fu^=1;
return *this+b;
}
Num operator*(Num b){
Num c;
c.len=len+b.len+2;
c.fu=fu^b.fu;
int i,j;
for(i=1;i<=c.len;i++)c.a[i]=0;
for(i=1;i<=len;i++)for(j=1;j<=b.len;j++){
c.a[i+j-1]+=a[i]*b.a[j];
if(c.a[i+j-1]>=B){
c.a[i+j]+=c.a[i+j-1]/B;c.a[i+j-1]%=B;
if(c.a[i+j]>=B)c.a[i+j+1]+=c.a[i+j]/B,c.a[i+j]%=B;
}
}
while(c.len>1&&!c.a[c.len])c.len--;
return c;
}
void write(){
printf("%d",a[len]);
for(int i=len-1;i;i--)printf("%04d",a[i]);
}
void set(int x){
fu=0;
len=1;
a[1]=x;
}
}f[N],C[N][N],ans,tmp;
void solve(int x,int y){
int i,j,now;
for(i=0;i<x;i++)b[i]=a[i];
b[x]=y;
for(i=0;i<n;i++)v[i]=0;
for(i=0;i<=x;i++){
if(v[b[i]])return;
v[b[i]]=1;
}
for(now=i=0;i<=x;i++)now+=b[i]==i;
if(now>fun)return;
now=fun-now;
int ret=0;
for(i=x+1;i<n;i++)if(!v[i])ret++;
for(i=now;i<=ret;i++){
Num t=f[n-1-x-i]*C[ret][i]*C[i][now];
if((i-now)&1)ans=ans-t;else ans=ans+t;
}
}
int main(){
scanf("%d",&n);
for(f[0].set(i=1);i<=n;i++)tmp.set(i),f[i]=f[i-1]*tmp;
for(C[0][0].set(i=1);i<=n;i++)for(C[i][0].set(j=1);j<=i;j++)C[i][j]=C[i-1][j-1]+C[i-1][j];
for(i=0;i<n;i++)scanf("%d",&a[i]),fun+=a[i]==i;
printf("%d ",fun);
for(i=0;i<n;i++)for(j=0;j<a[i];j++)solve(i,j);
ans.write();
return 0;
}
BZOJ1931 : [Shoi2007]Permutation 有序的计数的更多相关文章
- hdu 5868:Different Circle Permutation 【Polya计数】
似乎是比较基础的一道用到polya定理的题,为了这道题扣了半天组合数学和数论. 等价的题意:可以当成是给正n边形的顶点染色,旋转同构,两种颜色,假设是红蓝,相邻顶点不能同时为蓝. 大概思路:在不考虑旋 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- Good Bye 2018 (A~F, H)
目录 Codeforces 1091 A.New Year and the Christmas Ornament B.New Year and the Treasure Geolocation C.N ...
- 排列计数(permutation)
排列计数(permutation) 题目描述 求有多少种长度为n的序列A,满足以下条件: 1) 1~n这n个数在序列中各出现了一次 2) 若第i个数A[i]的值为i,则称i是稳定的.序列恰好有m个数是 ...
- HDU 4917 Permutation 拓扑排序的计数
题意: 一个有n个数的排列,给你一些位置上数字的大小关系.求合法的排列有多少种. 思路: 数字的大小关系可以看做是一条有向边,这样以每个位置当点,就可以把整个排列当做一张有向图.而且题目保证有解,所以 ...
- Algorithm: Permutation & Combination
组合计数 组合数学主要是研究一组离散对象满足一定条件的安排的存在性.构造及计数问题.计数理论是狭义组合数学中最基本的一个研究方向,主要研究的是满足一定条件的排列组合及计数问题.组合计数包含计数原理.计 ...
- [LeetCode] Merge k Sorted Lists 合并k个有序链表
Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complexity. 这 ...
- permutation II (boss出来了)
题目链接:https://leetcode.com/submissions/detail/55876321/ 自己的做法,30个测试用例通过了29例,终究还是有一个系列类型的是无法通过的,因为自己妄想 ...
- ACM/ICPC 之 DP-浅谈“排列计数” (POJ1037)
这一题是最近在看Coursera的<算法与设计>的公开课时看到的一道较难的DP例题,之所以写下来,一方面是因为DP的状态我想了很久才想明白,所以借此记录,另一方面是看到这一题有运用到 排列 ...
随机推荐
- c语言强制类型转换
一.强制类型转换 printf("3/2+100.5=%f",3/2+100.5);//100.5错误表达 printf (" (float)3/(float)2 ...
- [转]DB2类型转换函数
Src URL:http://www.cnblogs.com/QQParadise/articles/2642677.html
- EF – 2.EF数据查询基础(上)查询数据的实用编程技巧
目录 5.4.1 查询符合条件的单条记录 EF使用SingleOrDefault()和Find()两个方法查询符合条件的单条记录. 5.4.2 Entity Framework中的内部数据缓存 DbS ...
- 重温WCF之数单向通讯、双向通讯、回调操作(五)
一.单向通讯单向操作不等同于异步操作,单向操作只是在发出调用的瞬间阻塞客户端,但如果发出多个单向调用,WCF会将请求调用放入到服务器端的队列中,并在某个时间进行执行.队列的存储个数有限,一旦发出的调用 ...
- Fallout4 Creation Kit
按住SHIFT是旋转视角,按住鼠标中键 E是移动物品 双击W是旋转物品 数字键2 是调整物品大小
- WPF ItemsControl ListBox ListView比较
在进行列表信息展示时,WPF中提供多种列表可供选择.这篇博客将对WPF ItemsControl, ListBox, ListView进行比较. 相同点: 1. 这三个控件都是列表型控件,可以进行列表 ...
- hdu 4273 2012长春赛区网络赛 三维凸包中心到最近面距离 ***
新模板 /* HDU 4273 Rescue 给一个三维凸包,求重心到表面的最短距离 模板题:三维凸包+多边形重心+点面距离 */ #include<stdio.h> #include&l ...
- linux中预留的$变量
$0表示bash脚本的文件名 $1表示第一个参数 $*表示参数列表$0, $1, $2… $@表示"$1"/"$2"...每个变量都是独立的,用双引号括起来 $ ...
- 安装.net Framework 3.5 SP1非常慢的解决方案
解决方案:1.msiexec /unregserver回车,在输入命令:msiexec /regserver msiexec /unregserver是停止installer服务,而msiexec / ...
- Java学习随笔3:遍历文件夹及文件的读取和写入
import java.io.File; /** * 遍历文件夹 */ public class ScannerFile { public static void main(String[] args ...