soj 131 找题
soj 131 找题
给出两个长度为n,都含k个1的字符串A,B。现在令\(a_1,a_2,\dots,a_k\)是A中1的下标,\(b_1,b_2,\dots,b_k\)是B中1的下表,然后将a,b等概率随机排列,接下来按1到k的顺序交换\(A_{a_i}\)与\(A_{b_i}\)。令P为交换之后A与B相同的概率,求\(P*(k!)^2\)对\(998244353\)取模的结果。n<=10000。
本来以为只要随机排列b就行了,但是由于是顺序交换,所以要随机排列必须a和b都排列一下。那怎么办呢?我们来举个栗子:

上面是a串,下面是b串。我们发现,蓝框内的位置,A数组都能交换两次。红框内的位置只能交换一次。
设i表示还有i个位置可以交换两次,j表示还有j个位置可以交换一次。\(f[i][j]\)表示剩下i和j的方案数,那么就有状态转移方程:\(f[i][j]=f[i-1][j]+f[i][j-1]\)。(我也想不清楚)。
https://blog.csdn.net/WerKeyTom_FTD/article/details/78209400
#include <cstdio>
#include <cstring>
using namespace std;
const int mod=998244353;
const int maxn=10005;
int l, x, y;
char s1[maxn], s2[maxn];
int fmi(int a, int x){
long long base=a, ans=1;
for (; x; base=base*base%mod, x>>=1)
if (x&1) ans=ans*base%mod;
return ans;
}
int jc[maxn], revjc[maxn];
void init(){
jc[0]=revjc[0]=1;
for (int i=1; i<maxn; ++i){
jc[i]=1ll*jc[i-1]*i%mod;
revjc[i]=fmi(jc[i], mod-2);
}
}
int f[maxn][maxn/2], ans;
inline void up(int &x, int y){ x=(x+y)%mod; }
int c(int m, int n){ return 1ll*jc[m]*revjc[m-n]%mod*revjc[n]%mod; }
int main(){
init(); scanf("%s%s", s1, s2); l=strlen(s1);
for (int i=0; i<l; ++i)
if (s1[i]==49&&s2[i]==49) ++x;
else if (s1[i]==49||s2[i]==49) ++y;
y/=2;
f[x][y]=1;
for (int i=x; i>=0; --i)
for (int j=y; j>=0; --j){
if (i) up(f[i-1][j], 1LL*i*j%mod*f[i][j]%mod);
if (j) up(f[i][j-1], 1LL*j*j%mod*f[i][j]%mod);
}
for (int i=0; i<=x; ++i)
up(ans, 1LL*jc[i]*jc[i]%mod*f[i][0]%mod*c(x+y, i)%mod);
printf("%d\n", ans);
return 0;
}
soj 131 找题的更多相关文章
- Leetcode多线程题库练习(新功能尝鲜)& 个人感悟
大家好, 我是方子龙.很久没有自己写文章了. 一面是因为工作上的需求开发任务比较重,下班回家基本上就躺床玩几把王者,度过闲暇时光. 二面是一有点时间就自己主动地去看书和学习,知道自己还缺少很多知识,由 ...
- C语言编程学习打造——做题游戏
C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...
- 这 100 道 Python 题,拿去刷!!!
2020年,学 Python 还有价值吗? 根据 2020 年 2 月的 TIOBE 编程语言排行榜显示,Python仍然稳居第三位. 此排行榜排名基于互联网上有经验的程序员. 课程和第三方厂商的数量 ...
- 刷题记录:Codeforces Round #724 (Div. 2)
Codeforces Round #724 (Div. 2) 20210713.网址:https://codeforces.com/contest/1536. div2明显比div3难多了啊-只做了前 ...
- 小菜鸟之Oracle数据库
select * from STUDENT; select * from mark; select * from COURSE; select * from teacher; --注释 select ...
- 关于ACM的总结
看了不少大神的退役帖,今天终于要本弱装一波逼祭奠一下我关于ACM的回忆. 从大二上开始接触到大三下结束,接近两年的时间,对于大神们来说两年的确算不上时间,然而对于本弱来说就是大学的一半时光.大一的懵懂 ...
- 一些对数学领域及数学研究的个人看法(转载自博士论坛wcboy)
转自:http://www.math.org.cn/forum.php?mod=viewthread&tid=14819&extra=&page=1 原作者: wcboy 现在 ...
- 我的复杂的OpenCV编译之路(OpenCV3.1.0 + VS2010 + Win7)
教程:www.cnblogs.com/jliangqiu2016/p/5597501.html 这里主要记载我编译遇到的错误及解决方法. OpenCV3.1软件下载:https://sourcefor ...
- 树状数组求逆序对:POJ 2299、3067
前几天开始看树状数组了,然后开始找题来刷. 首先是 POJ 2299 Ultra-QuickSort: http://poj.org/problem?id=2299 这题是指给你一个无序序列,只能交换 ...
随机推荐
- strcmp与strncmp的区别
================== strcmp与strncmp都是用来比较字符串的,区别在于能否比较指定长度字符串. strcmp C/C++函数,比较两个字符串 设这两个字符串为str1,s ...
- 环形缓冲区的应用ringbuffer
在嵌入式开发中离不开设备通信,而在通信中稳定性最高的莫过于环形缓冲区算法, 当读取速度大于写入速度时,在环形缓冲区的支持下不会丢掉任何一个字节(硬件问题除外). 在通信程序中,经常使用环形缓冲区作为数 ...
- app中使用微信分享注意事项
1. 在微信公众平台开通一个微信公众号,https://mp.weixin.qq.com 2. 将自己制作好的已签名的app安装到手机上 3. 下载微信开放平台获取应用签名的apk--- gen ...
- Java中自定义枚举(Enum)项的值,可设置为指定的值
一.代码 package base.lang; /** * ClassName: StateEnum * @Description: TODO * @author fuming * @date 20 ...
- C# 连接Mysql 字符串
Database=XXX;Data Source=XXX;User Id=XXX;Password=XXX;pooling=false;CharSet=utf8;port=3306
- spring----AOP注解以及spring的JDBC和事务
技术分析之:Spring框架的AOP技术(注解方式) 1. 步骤一:创建JavaWEB项目,引入具体的开发的jar包 * 先引入Spring框架开发的基本开发包 * 再引入Spring框架的AOP的开 ...
- 为什么不推荐用破解版的winrar
站在winrar公司的角度,作为winrar的开发商或者运营商当然不希望用户使用破解版的winrar,因为这损害了他们的利益,这是屁股问题. 站在用户的角度,我希望免费使用世界上所有的软件.但这个世界 ...
- C语言实现文件实时更新
一.简介 在linux或者unix操作系统中在系统引导的时候会开启很多服务,这些服务就叫做守护进程. 守护进程脱离了终端并且在后台运行:守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显 ...
- spoj2142 Arranging Flowers
传送门 题目大意 给你n和m,表示一个n*n的数独已经填完了m行,让你填出剩下几行,要求答案的字典序最小. 分析 看到这道题我首先想到的是记录每行每列使用了哪些数字,然后贪心的来填,但是发现用这种策略 ...
- 什么是DMZ、DMZ端口、DMZ主机?
DMZ是英文“demilitarized zone”的缩写,中文名称为“隔离区”,也称“非军事化区”.它是为了解决安装防火墙后外部网络不能访问内部网络服务器的问题,而设立的一个非安全系统与安全系统之间 ...