#错排,排列组合#洛谷 4921 洛谷 4931 情侣?给我烧了

2024-02-11 05:32

本文主要是介绍#错排,排列组合#洛谷 4921 洛谷 4931 情侣?给我烧了,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目


分析

这里讲的是加强版,希望 O ( 1 ) O(1) O(1)回答
n n n排选择 m m m排座位的方案是 C ( n , m ) C(n,m) C(n,m),在 n n n对情侣中选择 m m m对和睦的情侣坐在这 m m m排位置上,方案是 P ( n , m ) P(n,m) P(n,m),每排的座位都可以交换坐,所以方案为 2 m 2^m 2m,剩下的不和睦的方案把它设为 d p [ n − m ] dp[n-m] dp[nm]
那么答案就是 C ( n , m ) ∗ P ( n , m ) ∗ 2 m ∗ d p [ n − m ] C(n,m)*P(n,m)*2^m*dp[n-m] C(n,m)P(n,m)2mdp[nm]
关键是 d p [ k ] dp[k] dp[k],对于一对情侣,若一个在左上角,有 2 k 2k 2k种选择,而右上角有 2 k − 2 2k-2 2k2种选择,分类讨论

  • 若右上角的配偶跟左上角的配偶在同一排,那么他们一个坐在一边,另一个坐在另一边,剩下的就是 k − 2 k-2 k2对不和谐的情侣,所以是 ( 2 k − 2 ) d p [ k − 2 ] (2k-2)dp[k-2] (2k2)dp[k2]
  • 若不在同一排,那么可以认为他们是同一对不和谐的情侣,所以是 d p [ k − 1 ] dp[k-1] dp[k1]

综上所述, d p [ k ] = 4 k ( k − 1 ) ( 2 ( k − 1 ) d p [ k − 2 ] + d p [ k − 1 ] ) dp[k]=4k(k-1)(2(k-1)dp[k-2]+dp[k-1]) dp[k]=4k(k1)(2(k1)dp[k2]+dp[k1])
以上的东西预处理 O ( 1 ) O(1) O(1)回答


代码

#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int N=5000001,mod=998244353;
int fac[N],inv[N],dp[N],mi[N];
inline signed iut(){rr int ans=0; rr char c=getchar();while (!isdigit(c)) c=getchar();while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();return ans;
}
inline void print(int ans){if (ans>9) print(ans/10);putchar(ans%10+48);
}
signed main(){fac[0]=fac[1]=inv[0]=inv[1]=dp[0]=mi[0]=1; mi[1]=2;for (rr int i=2;i<N;++i) inv[i]=1ll*inv[mod%i]*(mod-mod/i)%mod,mi[i]=2ll*mi[i-1]%mod;for (rr int i=2;i<N;++i) fac[i]=1ll*fac[i-1]*i%mod,inv[i]=1ll*inv[i-1]*inv[i]%mod;for (rr int i=2;i<N;++i) dp[i]=(1ll*(1ll*dp[i-2]*(2*i-2)+dp[i-1])%mod*i%mod*(i-1)<<2)%mod;for (rr int t=iut();t;--t){rr int n=iut(),k=iut();print(1ll*fac[n]*fac[n]%mod*inv[k]%mod*inv[n-k]%mod*inv[n-k]%mod*mi[k]%mod*dp[n-k]%mod);putchar(10);}return 0;
}

这篇关于#错排,排列组合#洛谷 4921 洛谷 4931 情侣?给我烧了的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/698950

相关文章

高精度计算(代码加解析,洛谷p1601,p1303)除法待更新

目录 高精度加法 高精度减法 高精度乘法 高精度加法 我们知道在c++语言中任何数据类型都有一定的表示范围。当两个被加数很大时,正常加法不能得到精确解。在小学,我们做加法都采用竖式方法。那么我们也只需要按照加法进位的方式就能得到最终解。 8 5 6+ 2 5 5-------1 1 1 1 加法进位: c[i] = a[i] + b[i];if(c[i] >=

CSP-J选择题 - 排列组合

排列问题:有5名学生参加比赛,要求排成一排拍照,有多少种不同的排列方式?组合问题:从10本书中选出3本书送给朋友,有多少种不同的选择方式?排列问题:一个教室有7个座位,5个学生需要坐下,有多少种不同的排列方式?组合问题:从12个人中选出4个人组成一个团队,有多少种不同的方式?排列问题:一个密码由4个字母组成,字母可以重复使用,有多少种不同的排列组合?组合问题:从8个不同颜色的球中选出3个,不考虑顺

洛谷 凸多边形划分

T282062 凸多边形的划分 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 先整一个半成品,高精度过两天复习一下补上 #include <iostream>#include <algorithm>#include <set>#include <cstring>#include <string>#include <vector>#include <map>

能量项链,洛谷

解释:  环形dp问题还是考虑将环拉直,可以参考我上一篇文章:环形石子合并 [2 3 5 10 2] 3 5 10 将环拉直,[]内是一个有效的区间,可以模拟吸收珠子的过程,         如[2 3 5] <=>(2,3)(3,5)    2是头,3是中间,5是尾 len >= 3:因为最后[2 10 2]是最小的可以合并的有效区间 len <= n + 1因为[2 3

HLJUOJ1127 HDU2049(错排公式+排列组合)

1127: 递推求解专题练习二 Time Limit: 1 Sec   Memory Limit: 128 MB Submit: 20   Solved: 8 [ Submit][ Status][ Web Board] Description 在电影院看电影时,总会有观众坐错座位号的情况。现在正在首播的青春爱情喜剧悬疑科幻大片《来治猩猩的你》观影现场爆满(满席)。 那么问题来了

HDU 2048 错排问题

题目: http://acm.hdu.edu.cn/showproblem.php?pid=2048 题解: n个人抽取的总情况为n!,所有人都没抽到自己名字的情况即错排数,存放在D[n]里,可用递推的方法求错排数D[n]。 显然D1=0,D2=1。当n≥3时,不妨设n排在了第k位,其中k≠n,也就是1≤k≤n-1。那么我们现在考虑第n位的情况。 当k排在第n位时,除了n和

Java 排列组合字符串

例如 输入“abc”,打印所有可能出现的组合情况,并且消除重复值。 所谓排列组合如下: 排列组合,字符串:abcbcaacbabccbabaccab排列组合个数:6 实现代码(结合Java8 lambda表达式实现) import org.junit.Test;import java.util.ArrayList;import java.util.HashSet;impo

洛谷P5490扫描线

0是最小的数字,将一个线段看成一个区间,对于一个矩形,从下扫到上,入边为1,而出边为-1,意思是将这个区间上的所有点加1(区间修改).把线段表示为Line[i],其中记录了l,r,h,tag,左右端点,高度,入边还是出边(1或-1) 那么每次区间修改后不为0的区间它的值可能是1,2,3或者是其它数字,这不好统计,可以将它转化一下,0是不是表示没有被覆盖过的地方,我们只要统计0的个数然后用总长减去

【HDU】 4832 Chess 排列组合 DP

Chess Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 351    Accepted Submission(s): 124 Problem Description   小度和小良最近又迷上了下棋。棋盘一共有N行M

挤牛奶洛谷uasco

题目描述 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶。第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒。第二个农民在700秒开始,在 1200秒结束。第三个农民在1500秒开始2100秒结束。期间最长的至少有一个农民在挤奶的连续时间为900秒(从300秒到1200秒),而最长的无人挤奶的连续时间(从挤奶开始一直到挤奶结束)为300秒(从1200秒到1500秒)。