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

对于这种数列置换的可以理解成多个环,而对于一个大小为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. writeValueAsString封装成工具类

    封装成工具类 <span style="font-family:Microsoft YaHei;">public static String toJsonByObjec ...

  2. 理解 Nova 架构

    Compute Service Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源. OpenStack 作为 IaaS 的云操作系统,虚拟机生命周期管理也就是通过 Nov ...

  3. hdu4619 / 最大独立集

    题意,一个矩阵,上面可以横放或者竖着放骨牌(1X2)保证横的与横的不重叠,竖的和竖的不重叠,求拿掉最小的牌,使所有的都不重叠. 分析:一看,不重叠就是没有边,拿最少,就是留最多,最大独立集啊!二分图, ...

  4. 【westorm系列之二】配置格式化

    1.执行格式化后,给句尾加分号

  5. CentOS yum update 与 yum upgrade 区别

    yum -y update 升级所有包同时也升级软件和系统内核 yum -y upgrade 只升级所有包,不升级软件和系统内核 官方文档:https://access.redhat.com/docu ...

  6. CMDB资产管理系统的数据表设计

    Server表: asset = models.OneToOneField('Asset') 主机名(hostname) sn号(sn) 制造商(manufacture) 系统(os_platform ...

  7. CodeChef - METEORAK Meteor

    Read problems statements in Mandarin Chineseand Russian. A meteor fell on Andrew's house. That's why ...

  8. Nginx阻止DDoS攻击的教程收集(转)(待实践)

    DDoS估计是一个非常头痛的问题. 分布式拒绝服务攻击(DDoS)指的是通过多台机器向一个服务或者网站发送大量看似合法的数据包使其网络阻塞.资源耗尽从而不能为正常用户提供正常服务的攻击手段.随着互联网 ...

  9. Maven错误 diamond operator is not supported in -source 1.5 (use -source 7 or higher to enable diamond operator)问题解决

    如果在Maven构建时出现: diamond operator is not supported in -source 1.5 (use -source 7 or higher to enable d ...

  10. Spring基于构造函数的依赖注入(DI)

    以下内容引用自http://wiki.jikexueyuan.com/project/spring/dependency-injection/spring-constructor-based-depe ...