http://poj.org/problem?id=3718 (题目链接)

题意

  给出${2}$个长度为${n}$的${01}$串,问是否存在${m}$个长度为${n}$的有三个位置为${1}$的$01$串它们的异或和正好等于那两个$01$串的异或和。求方案数。

Solution

  我们把那两个$01$串异或起来得到一个$S$,那么问题就变成了是否存在$m$个长度为$n$的有且仅有三个位置为$1$的$01$串的异或和等于$S$。

  我们这样进行考虑,假设$S$有$v$个位置上为$1$,先求出异或出来的串有$v$个位置为$1$的方案数,因为$v$个$1$可以任意组合,我们再除以一个组合数$C_{n}^{v}$就是答案。

  再添加一个条件,我们假设选出的$m$个数不同顺序算是不同的方案,求出来以后再除以一个$m!$就可以了。

  这样我们就可以dp啦。$f[i][j]$表示已经选了$i$个数,异或起来有$j$个$1$的方案数,那么最后答案就是$$ans=\frac{f[m][v]}{m!C_n^v}$$

  考虑转移,有这几种情况:

\begin{aligned}  f[i][j]&=f[i-1][j-3]\binom{n-j+3}{3}  \\  &+f[i-1][j-1]\binom{n-j+1}{2}(j-1)  \\  &+f[i-1][j+1](n-j-1)\binom{j+1}{2}  \\  &+f[i-1][j+3]\binom{j+3}{3}   \end{aligned}

  这应该很好理解吧,就是新加入的第$i$个数,它会对之前$i-1$个数已经异或出来的数造成的影响有$4$种:将三个$0$变成$1$;将两个$0$变成$1$,一个$1$变成$0$;将一个$0$变成$1$,两个$1$变成$0$;将三个$1$变成$0$。

  考虑到这样转移,并没有考虑第$i$个数与之前的$i-1$个数重复的情况。如果第$i$个数与之前某个数重复了,那么就意味着剩下的$i-2$个数异或起来还是会有$j$个$1$。所以我们还要容斥一下:

\begin{aligned}  f[i][j]-=f[i-2][j]\binom{n}{3}(i-1)   \end{aligned}

  表示第$i$个数的取值有$\binom{n}{3}$种,它可以与之前$i-1$个数中的任意一个相等。

  那么就做完了,最后转移的时候注意判一下边界。

细节

  LL

代码

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<cmath>
#define LL long long
#define inf (1ll<<30)
#define MOD 10007
#define Pi acos(-1.0)
#define free(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
using namespace std; const int maxn=1010;
int C[maxn][maxn],f[maxn][maxn],fac[maxn];
int n,m,v;
char s1[maxn],s2[maxn]; int power(int a,int b) {
int res=1;
while (b) {
if (b&1) res=(LL)res*a%MOD;
b>>=1;a=(LL)a*a%MOD;
}
return res;
}
int main() {
for (int i=0;i<=1000;i++) C[i][0]=1;
for (int i=1;i<=1000;i++)
for (int j=1;j<=i;j++) C[i][j]=(C[i-1][j]+C[i-1][j-1])%MOD;
fac[0]=1;for (int i=1;i<=1000;i++) fac[i]=(LL)fac[i-1]*i%MOD;
for (int i=1;i<=1000;i++) fac[i]=power(fac[i],MOD-2);
while (scanf("%d%d",&n,&m)!=EOF && n && m) {
scanf("%s%s",s1+1,s2+1);v=0;
for (int i=1;i<=n;i++) v+=(s1[i]!=s2[i]);
memset(f,0,sizeof(f));f[0][0]=1;
for (int i=1;i<=m;i++)
for (int j=0;j<=n;j++) {
if (j>=3) (f[i][j]+=(LL)C[n-j+3][3]*f[i-1][j-3]%MOD)%=MOD;
if (j>=1) (f[i][j]+=(LL)C[n-j+1][2]*(j-1)%MOD*f[i-1][j-1]%MOD)%=MOD;
if (j+1<=n) (f[i][j]+=(LL)C[j+1][2]*(n-j-1)%MOD*f[i-1][j+1]%MOD)%=MOD;
if (j+3<=n) (f[i][j]+=(LL)C[j+3][3]*f[i-1][j+3]%MOD)%=MOD;
if (i>=2) (f[i][j]+=MOD-(LL)f[i-2][j]*(C[n][3]-i+2)%MOD*(i-1)%MOD)%=MOD;
}
printf("%lld\n",(LL)f[m][v]*fac[m]%MOD*power(C[n][v],MOD-2)%MOD);
}
return 0;
}

【poj3718】 Facer's Chocolate Dream的更多相关文章

  1. poj3718 Facer's Chocolate Dream

    题目链接 正解:组合数+$dp$. 今天考试的题,考试的时候感觉自己有点脑残过头了.. 似乎发现了所有$1$其实都是一样的,然后不知道怎么强制每种物品只选一个.. 然后就写了一个所有物品可以选任意个的 ...

  2. 【BZOJ】2016: [Usaco2010]Chocolate Eating(二分)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2016 这些最大最小显然是二分. 但是二分细节挺多的...这里注意二分的区间,可以累计所有的可能,然后 ...

  3. poj 2411 Mondriaan&#39;s Dream 【dp】

    题目:id=2411" target="_blank">poj 2411 Mondriaan's Dream 题意:给出一个n*m的矩阵,让你用1*2的矩阵铺满,然 ...

  4. 【POJ2411】Mondriaan's Dream(轮廓线DP)

    [POJ2411]Mondriaan's Dream(轮廓线DP) 题面 Vjudge 题解 这题我会大力状压!!! 时间复杂度大概是\(O(2^{2n}n^2)\),设\(f[i][S]\)表示当前 ...

  5. 【poj2411】Mondriaan's Dream 状态压缩dp

    AC传送门:http://vjudge.net/problem/POJ-2411 [题目大意] 有一个W行H列的广场,需要用1*2小砖铺盖,小砖之间互相不能重叠,问有多少种不同的铺法? [题解] 对于 ...

  6. 【Codeforces 449A】Jzzhu and Chocolate

    [链接] 我是链接,点我呀:) [题意] 题意 [题解] 设最后行分成了x行,列分成了y列. 那么答案就是floor(n/x)floor(n/y) 然后x+y-2=k //即平均分配x行.y列 我们可 ...

  7. 【Demo】QQ,github,微博第三方社交登录

    本文主要讲解 集成 第三方社交账号登录 为什么会有这个需求? 主要是因为目前互联网的网站数量太多,如果在各个站点都注册一个账号 用户非常不容易记住每个账号的用户名和密码,并且非常难保证每个账号的密码足 ...

  8. 分享50款 Android 移动应用程序图标【下篇】

    在这个移动程序流行的时代,持续增长的应用程序经济充满了商业机遇.任何对应用程序设计感兴趣的人,将会喜欢上这里的50个独特的 Android 应用程序图标.这些例子中的图标能够让应用程序的设计更具吸引力 ...

  9. 【转】KM匹配题集

    转自:http://blog.csdn.net/shahdza/article/details/7779324 [HDU]2255 奔小康赚大钱 模板题★1533 Going Home 模板题★242 ...

随机推荐

  1. 20155237 2016-2017-2 《Java程序设计》第十周学习总结

    20155237 2016-2017-2 <Java程序设计>第十周学习总结 教材学习内容总结 计算机网络,是指分布在不同地理区域的计算机用通信线路互连起来的一个具有强大功能的网络系统.网 ...

  2. Linux rhel7 无线网络配置

    前言: 手提新装rhel7, ifconfig 发现只有lo 怎么办? 1. 检查网卡驱动装了没有: nmcli -a|grep wlp\ 如果没安装: a. lspci|grep Wireless ...

  3. cocos2d-x学习记录2——CCAction动作

    CCAction能够使CCNode运动起来,能够呈现出多种多样的动作.这些动作能够改变其运动方向.形状.大小.旋转等. 同时,还可利用CCCallFunc.CCCallFuncN.CCCallFunc ...

  4. [LOJ#6044]. 「雅礼集训 2017 Day8」共[二分图、prufer序列]

    题意 题目链接 分析 钦定 \(k\) 个点作为深度为奇数的点,有 \(\binom{n-1}{k-1}\) 种方案. 将树黑白染色,这张完全二分图的生成树的个数就是我们钦定 \(k\) 个点之后合法 ...

  5. SSIS 包配置

    在商业智能解决方案中,SSIS工程有两种部署模式:工程部署(project deployment)和包部署(package deployment),默认是工程部署模式,在Package的管理上,工程部 ...

  6. 部署AlwaysOn第三步:集群资源组的健康检测和故障转移

    资源组是由一个或多个资源组成的组,WSFC的故障转移是以资源组为单位的,资源组中的资源是相互依赖的.一个资源所依赖的其他资源必须和该资源处于同一个资源组,跨资源组的依赖关系是不存在的.在任何时刻,每个 ...

  7. unity2D以最小的角度旋转到目标方向(y方向为角色的主方向)

    一.使用向量原理转换到目标方向 为了让角色的自身y转向目标方向,并且以最小角度旋转,要点是获得当前方向与目标方向的叉值,从而判断应该旋转的方向 float rotateSpeed; //相对目标位置运 ...

  8. 大厂面试官:Java工程师的“十项全能”

    想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,在面试之前到底需要准备哪些东西呢?面试时面试官想了解你的什么专业技能,以下都是一个合格Java软件工程师所要具备的. 一.专业技能 熟练的 ...

  9. OpenMPI源码剖析:网络通信原理(二) 如何选择网络协议?

    因为比较常用的是 TCP 协议,所以在 opal/mca/btl/tcp/btl_tcp.h 头文件中找到对应的 struct mca_btl_tcp_component_t { mca_btl_ba ...

  10. Istio全景监控与拓扑

    根据Istio官方报告,Observe(可观察性)为其重要特性.Istio提供非侵入式的自动监控,记录应用内所有的服务. 我们知道在Istio的架构中,Mixer是管理和收集遥测信息的组件.每一次当请 ...