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

对于这种数列置换的可以理解成多个环,而对于一个大小为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. Java远程调用BPS流程实现流程运行简单示例

    1.简介:略 2.背景:略 3.目的:自我学习笔记 4.实现过程 (1).画出流程图 如下: 路由活动分支下的条件语句为复杂表达式: ((account<200&&divisio ...

  2. laravel 查询构造器

    //查询构造器public function query(){ $bool = DB::table('student')->insert([ ['name' => '王五', 'age' ...

  3. SGU 105 数学找规律

    观察一下序列,每3个数一组,第一个数余1,不能,加第二个数后整除(第二个数本身余2),第三数恰整除.一行代码的事.011011011.... #include<iostream> usin ...

  4. Lighttpd 服务器的安装

    https://www.cnblogs.com/rongfengliang/articles/3503228.html

  5. Codeforces 486D Valid Sets (树型DP)

    题目链接 Valid Sets 题目要求我们在一棵树上计符合条件的连通块的个数. 满足该连通块内,点的权值极差小于等于d 树的点数满足 n <= 2000 首先我们先不管这个限制条件,也就是先考 ...

  6. 快速掌握RabbitMQ(三)——消息确认、持久化、优先级的C#实现

    1 消息确认 在一些场合,如转账.付费时每一条消息都必须保证成功的被处理.AMQP是金融级的消息队列协议,有很高的可靠性,这里介绍在使用RabbitMQ时怎么保证消息被成功处理的.消息确认可以分为两种 ...

  7. Spring启动流程

    首先,对于一个web应用,其部署在web容器中,web容器提供其一个全局的上下文环境,这个上下文就是ServletContext,其为后面的spring IoC容器提供宿主环境: 其次,在web.xm ...

  8. Android 集成支付宝支付详解

    一说到支付宝,相信没有人不知道,生活中付款,转账都会用到. 今天来详细介绍下在Android中如何集成支付宝支付到自己的APP中去.让APP能够拥有方便,快捷的支付功能. 准备工作: 商户在b.ali ...

  9. 空暇时候思考2(&#39;\0&#39;等价于数字0还是字符0)

    /********************************************************************** * * Copyright (c)2015,WK Stu ...

  10. Spring4+SpringMVC+Hibernate4整合入门与实例

    配置web.xml <? xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=&q ...