[hdu6391]Lord Li's problem
首先发现结果与需要改变的具体位置无关,只和需要改变的位置的个数有关,因此设f[i][j]表示选取了i个数字异或结果有j个1,只要分析接下来选择的数和这j个1有几个重合即可:
1. 三个数字全部重合,即$f[i][j+3]+=f[i-1][j]\cdot c(n-j,3)$
2. 有两个数字重合,即$[i][j+1]+=f[i-1][j]\cdot c(n-j,2)\cdot j$
3. 有一个数字重合,即$f[i][j-1]+=f[i-1][j]\cdot (n-j)\cdot c(j,2)$
4. 有0个数字重合,即$f[i][j-3]+=f[i-1][j]\cdot c(j,3)$
然而这并不正确,因为不能重复选择,因此去掉($c(n,3)-(i-2))\cdot f[i-2][j]$,同时这里我们考虑了操作的顺序和操作的位置,再除以$n!\cdot c(n,m)$才是最终答案。

1 #include<bits/stdc++.h>
2 using namespace std;
3 #define mod 19260817
4 int n,m,t,sum,inv[101],fac[101],f[101][101];
5 char s1[101],s2[101];
6 int c(int n,int m){
7 return 1LL*fac[n]*inv[n-m]%mod*inv[m]%mod;
8 }
9 int cc(int n,int m){
10 return 1LL*inv[n]*fac[n-m]%mod*fac[m]%mod;
11 }
12 int main(){
13 inv[0]=inv[1]=fac[0]=fac[1]=1;
14 for(int i=2;i<=40;i++)fac[i]=1LL*fac[i-1]*i%mod;
15 for(int i=2;i<=40;i++)inv[i]=1LL*(mod-mod/i)*inv[mod%i]%mod;
16 for(int i=2;i<=40;i++)inv[i]=1LL*inv[i-1]*inv[i]%mod;
17 while (scanf("%d%d",&n,&m)!=EOF){
18 if ((!n)&&(!m))return 0;
19 scanf("%s%s",s1,s2);
20 sum=0;
21 for(int i=0;i<n;i++)
22 if (s1[i]!=s2[i])sum++;
23 memset(f,0,sizeof(f));
24 f[0][0]=1;
25 for(int i=0;i<=m;i++)
26 for(int j=0;j<=n;j++){
27 if (i>1)f[i][j]=(f[i][j]-f[i-2][j]*(i-1LL)%mod*(c(n,3)-i+2)%mod+mod)%mod;
28 for(int k=-1;k<3;k++)
29 if ((n>j+k)&&(j+k>1))
30 f[i+1][j+2*k-1]=(f[i+1][j+2*k-1]+1LL*c(n-j,k+1)*c(j,2-k)*f[i][j])%mod;
31 }
32 printf("Case #%d: %d\n",++t,1LL*f[m][sum]*cc(n,sum)%mod*inv[m]%mod);
33 }
34 }
[hdu6391]Lord Li's problem的更多相关文章
- 2018 Multi-University Training Contest 7 Solution
A - Age of Moyu 题意:给出一张图,从1走到n,如果相邻两次走的边的权值不同,花费+1, 否则花费相同,求最小花费 思路:用set记录有当前点的最小花费有多少种方案到达,然后最短路 #i ...
- CodeForces 173B Chamber of Secrets spfa
Chamber of Secrets 题目连接: http://codeforces.com/problemset/problem/173/B Description "The Chambe ...
- jstl表达式使用方法
1.jstl.jar servlet.jar支持 2.jsp引入标签库 <%@ taglib prefix="c" uri="http://java.sun.co ...
- Django 2.0 URL
Overview¶ A view is a “type” of Web page in your Django application that generally serves a specific ...
- POJ2594 Treasure Exploration[DAG的最小可相交路径覆盖]
Treasure Exploration Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 8301 Accepted: 3 ...
- Django文档阅读-Day3
Django文档阅读-Day3 Writing your first Django app, part 3 Overview A view is a "type" of Web p ...
- [LeetCode] The Skyline Problem 天际线问题
A city's skyline is the outer contour of the silhouette formed by all the buildings in that city whe ...
- Stanford Prof. Li Feifei写给她学生的一封信
De-mystifying Good Research and Good Papers By Fei-Fei Li, 2009.03.01 Please remember this: 1000+ co ...
- [LeetCode] The Skyline Problem
A city's skyline is the outer contour of the silhouette formed by all the buildings in that city whe ...
随机推荐
- vue3 专用 indexedDB 封装库,基于Promise告别回调地狱
IndexedDB 的官网 https://developer.mozilla.org/zh-CN/docs/Web/API/IndexedDB_API 这个大概是官网吧,原始是英文的,现在陆续是出中 ...
- 初识Tomcat源码
Tomcat 部署的三种方式 打包成war包 部署到webapp目录录下 为什么要打包成war包,而不是jar包呢? 因为jar包可能是一个项目,也可能是一个依赖,Tomcat读取容易造成混淆.于是一 ...
- 【NXOpen.UF扩展】修改表达式
public static class UFExpEx { /// <summary> /// 修改当前部件的表达式 /// </summary> /// <param ...
- scala基础篇 使用getter和setter方法而不使用public的情形
主要是基于2种情形 1) 提供读只取/只写入方法,不能随意读写 2)做赋值时变量控制,比如设定值的区间范围等 例子: object test{ def main(args: Array[String] ...
- 【UE4 C++ 基础知识】<4> 枚举 Enum、结构体 Struct
枚举 UENUM宏搭配BlueprintType可以将枚举暴露给蓝图,不使用的话,仅能在C++使用 //定义一个原生enum class enum class EMyType { Type1, Typ ...
- pycharm中的terminal和Windows命令提示符有什么区别?二者用pip安装的包是不是位于相同位置?
那要看pycharm使用了什么shell,可以在设置->工具->终端里查看shell path.如果使用的是cmd.exe那就没区别.pycharm终端和Windows命令提示符用pip安 ...
- Spring Security Resource Server的使用
Spring Security Resource Server的使用 一.背景 二.需求 三.分析 四.资源服务器认证流程 五.实现资源服务器 1.引入jar包 2.资源服务器配置 3.资源 六.测试 ...
- SpringBoot小知识点
记录SpringBoot的小知识点 一.在 Spring 上下文刷新之前设置一些自己的环境变量 1.实现 EnvironmentPostProcessor 接口 2.spring.factories ...
- 要想玩转FPGA,按这4个步骤来
FPGA 作为一种高新技术,由于其结构的特殊性,可以重复编程,开发周期较短,越来越受到电子爱好者的青睐,其应用已经逐渐普及到了各行各业.因此,越来越多的学生或工程师都希望跨进FPGA的大门掌握这门技术 ...
- 单片机stm32串口分析
stm32作为现在嵌入式物联网单片机行业中经常要用多的技术,相信大家都有所接触,今天这篇就给大家详细的分析下有关于stm32的出口,还不是很清楚的朋友要注意看看了哦,在最后还会为大家分享有些关于stm ...