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

对于这种数列置换的可以理解成多个环,而对于一个大小为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 _=100;
const int maxn=2*1e3+_;
const LL mod=998244353;LL C[maxn][maxn],S[maxn][maxn],A[maxn][maxn];//i的降j次幂
void yu()
{C[0][0]=S[0][0]=A[0][0]=1;for(int i=1;i<maxn;i++){C[i][0]=A[i][0]=1;for(int j=1;j<=i;j++)C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod,S[i][j]=(S[i-1][j-1]+(i-1)*S[i-1][j])%mod,A[i][j]=A[i][j-1]*(i-j+1)%mod;}
}//------------------------------------------def-------------------------------------------------------bool vis[maxn*2];int n,nxt[maxn*2],cnt[4];//0-x,x-0,x-x,0-0
void dfs(int x,int st)
{vis[x]=true;if(nxt[x]==0){if(x>n&&st>n)cnt[3]++;else if(x<=n&&st>n)cnt[0]++;else if(x>n&&st<=n)cnt[1]++;}else{if(!vis[nxt[x]])dfs(nxt[x],st);else cnt[2]++;}
}//-------------------------------------------分类讨论---------------------------------------------- void calc(LL *u,int k)
{for(int x=0;x<=k;x++)for(int i=x;i<=k;i++)u[x]=(u[x]+C[k][i]*S[i][x]%mod*A[cnt[3]+k-i][k-i])%mod;for(int i=0;i<=k;i++){for(int j=i+1;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[0]),calc(g,cnt[1]);for(int i=0;i<=n;i++)for(int j=0;j<=i;j++)h[i]=(h[i]+f[j]*g[i-j])%mod;        for(int i=0;i<=n;i++)for(int j=0;j<=i;j++)as[i]=(as[i]+h[j]*S[cnt[3]][i-j])%mod;for(int i=0;i<=n;i++)as[i]=as[i]*A[cnt[3]][cnt[3]]%mod;
}//--------------------------------------------solve-------------------------------------------------int a[maxn],b[maxn]; bool ru[maxn*2];
int main()
{freopen("gift.in","r",stdin);freopen("gift.out","w",stdout);yu();scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=1;i<=n;i++)scanf("%d",&b[i]);memset(vis,true,sizeof(vis));for(int i=1;i<=n;i++){if(a[i]==0)a[i]=i+n;if(b[i]==0)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=1;i<=2*n;i++)if(!vis[i]&&!ru[i])dfs(i,i);for(int i=1;i<=2*n;i++)if(!vis[i])dfs(i,i);solve();for(int i=0;i<n;i++)printf("%lld ",n-cnt[2]-i>=0?as[n-cnt[2]-i]:0);puts("");return 0;
}

转载于:https://www.cnblogs.com/AKCqhzdy/p/10336882.html

bzoj5406: Gift相关推荐

  1. HackerRank Gift Boxes(hash)

    在当前计算的长度不小于g字符串长度时,需要比较c串对应长度的哈希值与g的哈希值,如果相同,则需要更新当前的计算哈希的下标. 代码参考: OJ/hackerrank/Gift Boxes at mast ...

  2. NYOJ -804 Gift (二分)

    Gift 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 HEIHEI was planning to send his friends some necklaces a ...

  3. CodeForces - 1538G Gift Set(二分)

    题目链接:点击查看 题目大意:给出 a,b,x,ya,b,x,ya,b,x,y,分别表示有 aaa 个蓝色糖果和 bbb 和红色糖果,现在有两种打包方式: xxx 个蓝色糖果和 yyy 个红色糖果 y ...

  4. USACO Training Section 1.1 贪婪的送礼者Greedy Gift Givers

    P1201 [USACO1.1]贪婪的送礼者Greedy Gift Givers 题目描述 对于一群(NP个)要互送礼物的朋友,GY要确定每个人送出的钱比收到的多多少.在这一个问题中,每个人都准备了一 ...

  5. Codeforces Round #725 (Div. 3) G. Gift Set 二分

    传送门 文章目录 题意: 思路: 题意: 有两种物品分别有x,yx,yx,y个,每次可以从一个拿出aaa个,另一个拿出bbb个分成一组,问最多能分成多少组. 思路: 这个题有一个显然的单调性,所以二分 ...

  6. 【高精】Gift(jzoj(gz) 1763)

    Gift jzoj(gz) 1763 题目大意: 有9个数:a,b,c--i,计算出2a+2b+--2h+i2^a+2^b+--2^h+i2a+2b+--2h+i 输入样例 1 21 30 0 0 0 ...

  7. 礼物gift(DP)

    这道题的DP非常的有意思-- 一开始我们总是会以为这是一个背包问题,直接dp[0] = 0,dp[j] += dp[j-c[i]]进行转移.之后统计一下从dp[m-minn]~dp[m]的答案之和为结 ...

  8. UVA10120 ZOJ1229 Gift?!【DFS+BFS】

    Gift?! Time Limit: 2000 msMemory Limit: 65536 KB There is a beautiful river in a small village. N ro ...

  9. Bailian4107 19岁生日礼物-Birthday Gift【进制】

    4107:19岁生日礼物-Birthday Gift 总时间限制: 1000ms 内存限制: 65536kB 描述 今天是小红的19岁生日,小明决定给小红买个生日礼物,但是为了突出是19岁的生日,生日 ...

最新文章

  1. 如何利用数据仓库优化数据分析?
  2. poj3934Queue(dp)
  3. sql 操作字符串备忘(转)
  4. 鲲鹏数据开源库python_google_translator介绍
  5. VC调用matlab中定义的.m文件中的函数的实例
  6. 20165201 2017-2018-2 《Java程序设计》第3周学习总结
  7. Error: No valid Oracle clients found. You need at least one 64-bit client properly configured.
  8. python核心编程:第六章。
  9. java B2B2C Springboot多租户电子商城系统-Spring Cloud Stream(消息驱动)
  10. 完整学习git三 查看暂存区目录树 git diff
  11. 决策树(十二)--XGBoost
  12. turbo c 混编 汇编语言,Turbo C 编译 嵌入汇编
  13. 高等代数-三-消元法
  14. 织梦dedecms采集规则,东方资讯娱乐新闻采集规则
  15. 对称加密算法和非对称加密算法的完美结合
  16. Two-Stream Convolutional Networksfor Action Recognition in Videos——学习笔记
  17. 服务器centos系统诛仙,云服务器搭建诛仙教程
  18. org.apache.hadoop.hive.metastore.HiveMetaException: Failed to get schema version, Cause:Table ‘hive.
  19. You can't specify target table 'sys_user_function' for update in FROM clause
  20. linux下双网卡设置(内外网)

热门文章

  1. Hashtable几种常用的遍历方法
  2. C语言学习系列(六)基本语法
  3. Windows 下修改 MySQL 编码为 utf8
  4. day18-事务与连接池 1.复习
  5. AutoCAD ObjectARX和RealDWG的基本数据操作
  6. Spring2.5事务配置的5种方法
  7. 【Vue2.0】—github小案例(二十三)
  8. 装修公司都有什么套路?
  9. 感觉自己没有美术天赋,要不要放弃成为艺术生?
  10. 二婚不领证吃亏的是谁?