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

对于这种数列置换的可以理解成多个环,而对于一个大小为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. json格式前端显示

    使用angular可以稍加修改. [转]http://web.jobbole.com/82865/ function output(inp) { document.body.appendChild(d ...

  2. Codevs 2989 寻找somebody

    时间限制: 2 s 空间限制: 8000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在一个n*m的方阵中 寻找somebody的位置 有可能k不存在输出“bianta ...

  3. Yii 之控制器响应

    public function actionIndex(){ //控制器响应处理 $res = \Yii::$app->response; //设置状态码 // $res->statusC ...

  4. python--错误了就需要调试(异常处理)

    python提供了两个非常重要的功能来处理python程序在运行中出现的异常和错误.你可以使用该功能来调试python程序. 我们可打开idle-->F1进行查看文档,里面很多异常类型,如图: ...

  5. Java常用API(Scanner,Random)匿名对象

    API:即Application programming Interface,应用编程接口. Java中封装了许许多多的API供用户使用,Scanner与Random便是其中之一,API实际就是类,已 ...

  6. BZOJ3674 可持久化并査集

    @(BZOJ)[可持久化并査集] Description n个集合 m个操作 操作: 1 a b 合并a,b所在集合 2 k 回到第k次操作之后的状态(查询算作操作) 3 a b 询问a,b是否属于同 ...

  7. Java中Class.this和this的区别(转)

    当inner class(内部类)必顺使用到outer class(外部类)的this instance(实例)时,或者匿名内部类要使用外部类的实例. 例: class Outer{ String d ...

  8. DeepFM

    DeepFM integrates the architectures of FM and deep neural networks (DNN). It models low-order featur ...

  9. BUPT复试专题—统计节点个数(2013)

    题目描述 给出一棵有向树,一共有n个节点,如果一个节点的度(入度+出度)不小于它所有儿子以及它父亲的度(如果存在父亲或儿子),那么我们称这个节点为p节点,现在你的任务是统计p节点的个数. 如样例,第一 ...

  10. 几种自己主动运行js代码的方式

    近期在看jquery,发现他竟然能自己主动运行js代码,于是就查了下.收集了几种经常使用的实现方法 jquery的方法 使用场景:不论什么须要运行的js特效 $(document).ready(fun ...