全程膜拜 码得都要一样了。。

对于这种数列置换的可以理解成多个环,而对于一个大小为d的环把顺序弄对要做d-1次

总起来就是n-环数的次数 加上暴力30pt到手啦

假如题目没有限制,那就是第一类斯特林数,因为点有序再乘一个所有点的全排列 又20pt到手啦,考场上就溜了

先缩链,一条链只有头和尾是有用的

现在考虑分情况讨论。如果我们让第一个数列的数字连向第二个数列的对应数字(或许这样理解环容易些),将有四种情况:上面是否有当前数字,下面是否有当前数字。给出的限制相当于提前先给了一些链

假如用二进制表示,0没有1有会方便点

对于11就不用管了,对于直接就是一个环的更不用管了,最后减一下直接是一个环的个数就好

主要问题在01和10,这两个是类似的,容易发现它们是不能互接成链的(废话要不就成11了),处理一个就行了吧。处理10的情况

我们先把出现10情况的数字个数处理出来

设f[i]表示这些数字构成的环数为i的方案数

当然这样的东西肯定是要上个容斥的,设g[i]是至少为i,要有g[i]=sigema(i~n)j f[j]*j的容斥系数

这样g[x]=sigema(x^k)i C(k,i)*S1(i,x)*(m+k-i)^(k-i)

k为10情况的数字个数,m为00情况的个数,含义为选i个数字,然后把它划分到x个环,剩下的k-i个10情况的数字可以选择接去其中一个状态为00的数字,连了边以后相当于一个10一个01,我们也可以看成一个11一个00,恰好抵消扔给00的情况自己处理,也可以接到一个未划分的或者不接,未划分的自己也会找其他的,不接就自环咯。因为选了就不能再选所以是降次幂

考虑f对g的贡献,对于fd,对gx的贡献为C(d,x),意为d中选x个环给选中,于是g[i]=sigema(i~n)j f[j]*C(j,i),直接二项式反演即可

00的情况就是20pt的做法

as[x]=∑∑∑f(i)g(j)h(k)(i+j+k==x) 分别是10,01,00的情况

做两次卷积,因为数据小那就不彂(fa)發(fa)闧(ta)了我不会NTT啊,直接暴力搞

#include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath> #define rcy(x) ((x)%2==0?1:-1)
using namespace std;
typedef long long LL;
const int _=;
const int maxn=*1e3+_;
const LL mod=; LL C[maxn][maxn],S[maxn][maxn],A[maxn][maxn];//i的降j次幂
void yu()
{
C[][]=S[][]=A[][]=;
for(int i=;i<maxn;i++)
{
C[i][]=A[i][]=;
for(int j=;j<=i;j++)
C[i][j]=(C[i-][j-]+C[i-][j])%mod,
S[i][j]=(S[i-][j-]+(i-)*S[i-][j])%mod,
A[i][j]=A[i][j-]*(i-j+)%mod;
}
} //------------------------------------------def------------------------------------------------------- bool vis[maxn*];int n,nxt[maxn*],cnt[];//0-x,x-0,x-x,0-0
void dfs(int x,int st)
{
vis[x]=true;
if(nxt[x]==)
{
if(x>n&&st>n)cnt[]++;
else if(x<=n&&st>n)cnt[]++;
else if(x>n&&st<=n)cnt[]++;
}
else
{
if(!vis[nxt[x]])dfs(nxt[x],st);
else cnt[]++;
}
} //-------------------------------------------分类讨论---------------------------------------------- void calc(LL *u,int k)
{
for(int x=;x<=k;x++)
for(int i=x;i<=k;i++)
u[x]=(u[x]+C[k][i]*S[i][x]%mod*A[cnt[]+k-i][k-i])%mod; for(int i=;i<=k;i++)
{
for(int j=i+;j<=k;j++)
u[i]=(u[i]+rcy(j-i)*u[j]*C[j][i])%mod;
u[i]=(u[i]+mod)%mod;
}
}
LL f[maxn],g[maxn],h[maxn],as[maxn];
void solve()
{
calc(f,cnt[]),calc(g,cnt[]); for(int i=;i<=n;i++)
for(int j=;j<=i;j++)
h[i]=(h[i]+f[j]*g[i-j])%mod;
for(int i=;i<=n;i++)
for(int j=;j<=i;j++)
as[i]=(as[i]+h[j]*S[cnt[]][i-j])%mod; for(int i=;i<=n;i++)as[i]=as[i]*A[cnt[]][cnt[]]%mod;
} //--------------------------------------------solve------------------------------------------------- int a[maxn],b[maxn]; bool ru[maxn*];
int main()
{
freopen("gift.in","r",stdin);
freopen("gift.out","w",stdout);
yu();
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i<=n;i++)scanf("%d",&b[i]); memset(vis,true,sizeof(vis));
for(int i=;i<=n;i++)
{
if(a[i]==)a[i]=i+n;
if(b[i]==)b[i]=i+n;
vis[a[i]]=vis[b[i]]=false;
if(a[i]<=n||b[i]<=n)
nxt[a[i]]=b[i],ru[b[i]]=true;
}
for(int i=;i<=*n;i++)
if(!vis[i]&&!ru[i])dfs(i,i);
for(int i=;i<=*n;i++)
if(!vis[i])dfs(i,i); solve();
for(int i=;i<n;i++)
printf("%lld ",n-cnt[]-i>=?as[n-cnt[]-i]:);
puts("");
return ;
}

bzoj5406: Gift的更多相关文章

  1. USACO . Greedy Gift Givers

    Greedy Gift Givers A group of NP (2 ≤ NP ≤ 10) uniquely named friends has decided to exchange gifts ...

  2. CF# Educational Codeforces Round 3 B. The Best Gift

    B. The Best Gift time limit per test 2 seconds memory limit per test 256 megabytes input standard in ...

  3. 快来玩“Gift大转盘”百分百赚好礼

    现在开始到今年的最后一天,你天天都可以来转100%中奖的“ Gift大转盘 ”.代金券.产品折扣.精美纪念礼,没有多余规则.全部网友都可参加,转到就是你赚到,赶快转起来吧! >>活动主页& ...

  4. Gift Hunting(分组背包)

    Gift Hunting Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...

  5. Codeforces Educational Codeforces Round 3 B. The Best Gift 水题

    B. The Best Gift 题目连接: http://www.codeforces.com/contest/609/problem/B Description Emily's birthday ...

  6. 1002 GTY's birthday gift

    GTY's birthday gift                                                                       Time Limit ...

  7. [light oj 1328] A Gift from the Setter

    1328 - A Gift from the Setter   Problem setting is somewhat of a cruel task of throwing something at ...

  8. 119 - Greedy Gift Givers

     Greedy Gift Givers  The Problem This problem involves determining, for a group of gift-giving frien ...

  9. HDU 5171 GTY's birthday gift 矩阵快速幂

    GTY's birthday gift Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

随机推荐

  1. Cards BZOJ 1004

    Cards [问题描述] 小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张 ...

  2. 安装sqlServer2012失败补救

    今天拿着新电脑win10,装数据库2012,装了第一次,没装上,有一半的工具都失败了,慌了.. 连management studio都没装上,我用navicat也连不上. 卸了,第二次安装,装一半卡住 ...

  3. svn服务安装与配置

    SVN安装 centos系统下执行yum install subversion 创建项目 svnadmin create dxk-test 创建项目dxk-test 服务配置与权限控制 vim con ...

  4. maven编码gbk的不可映射字符

    如图,老是出现这个错误,百度说是打开源文件,更改编码格式,或者是更改File Encodings 的编码格式,或者是更改java compiler --use computer为eclipse, 都不 ...

  5. Codeforces Round #512 (Div. 2, based on Technocup 2019 Elimination Round 1) E. Vasya and Good Sequences

    题目链接 官网题解写的好清楚,和昨晚Aguin说的一模一样…… 这题只和每个数1的个数有关,设每个数1的个数的数组为$b$,就是首先一段如果是好的,要满足两个条件: 1.这一段$b$数组和为偶数,因为 ...

  6. POJ 3694 (tarjan缩点+LCA+并查集)

    好久没写过这么长的代码了,题解东哥讲了那么多,并查集优化还是很厉害的,赶快做做前几天碰到的相似的题. #include <iostream> #include <algorithm& ...

  7. Python爬虫简单实现之Q乐园图片下载

    根据需求写代码实现.然而跟我并没有什么关系,我只是打开电脑望着屏幕想着去干点什么,于是有了这个所谓的“需求”. 终于,我发现了Q乐园——到底是我老了还是我小了,这是什么神奇的网站,没听过啊,就是下面酱 ...

  8. 使用RTL-SDR,从打开一个车门到批量打开车门

    在最近几年,入侵汽车在当代社会的黑客圈中成为热点,很多文章表明汽车产业还有很多东西等待完善,在本篇文章中,我会让你熟悉我一直研究的一些概念,以及如何在网状网络中使用一些便宜的部件渗透远程开门系统. 软 ...

  9. 一种排序(nyoj8)(简单排序)

    一种排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描写叙述 如今有非常多长方形.每个长方形都有一个编号,这个编号能够反复.还知道这个长方形的宽和长,编号.长.宽都是整数 ...

  10. SolidEdge如何绘制变化半径倒圆角

    1 在要变化半径的边上打一些点   2 点击倒角命令的参数对话框,选择可变半径   3 选择倒角的直线,右击确认,再依次点击关键点,修改倒角数值,修改之后按回车,继续下一个点,直到结束.