[P4921] 情侣?给我烧了!

回顾一下错排公式

错排问题:
设n位错排数为D[n]。考虑元素1的位置,设置为k(有n-1中 );在考虑元素k的位置,
若为1,则转换为n-2位的错排;否则,视元素k为元素1(不能放在位置1),转换为n-1位的错排。
故 D[n]=(n-1)(D[n-1]+D[n-2]) D[1]=0 D[2]=1
也有公式D[n]=n!/e (e=1-1/1!+1/2!-1/3!+……+(-1)^n*1/n!)

设g(x)为x对情侣都在x排里都错开的方案数。
对于询问的k,其答案=C(n,k)A(n,k)pow(2,k)*g(n-k)

式子从左到右依次表示:
1)在n排中选出k排
2)每对情侣中占某一排排
3)情侣双方的位置互调
4)剩下n-k对情侣都要错开。

然后考虑g(x)的算法。

这是就要联想到错排序列的构造方法。
考虑第一排的情况:
1)俩男(x(x-1)种),考虑他们对应的俩女
a)这俩女在同一排((x-1)
2种方案),此时转化为g(x-2)。
b)这俩女不在同一排, 就把她们当做一对情侣,转化为g(x-1)
2)俩女,与俩男同
3)左男右女,仔细想想是与俩男还是一样的。
4)左女右男,仔细想想是与俩男还还是一样的。

故转移为g(x)=(1+1+1+1)(x(x-1)((x-1)2*g(x-2)+g(x-1)))=4x(x-1)(2(x-1)g(x-2)+g(x-1))
显然g(1)=0, g(2)=8 //于是g(0)=1...

时间复杂图 O(Tn)

#include <bits/stdc++.h>
using namespace std;

const int N=1e3+7;
const int P=998244353;

int fac[N]={1};
int inv[N]={0,1};
int fiv[N]={1};
int g[N]={1};
int b[N]={1};

inline int C(int x,int y) {
    return 1LL*fac[x]*fiv[y]%P*fiv[x-y]%P;
}
inline int A(int x,int y) {
    return 1LL*fac[x]*fiv[x-y]%P;
}
inline int f(int n,int k) {
    return 1LL*C(n,k)%P*A(n,k)%P*b[k]%P*g[n-k]%P;
}

int main() {
    for(int i=1; i<N; ++i) fac[i]=1LL*fac[i-1]*i%P;
    for(int i=2; i<N; ++i) inv[i]=1LL*(P-P/i)*inv[P%i]%P;
    for(int i=1; i<N; ++i) fiv[i]=1LL*inv[i]*fiv[i-1]%P;
    for(int i=2; i<N; ++i) g[i]=4LL*i*(i-1)%P*(2LL*(i-1)*g[i-2]%P+g[i-1])%P;
    for(int i=1; i<N; ++i) b[i]=b[i-1]*2LL%P;
    int T,n;
    scanf("%d",&T);
    while(T--) {
        scanf("%d",&n);
        for(int k=0; k<=n; ++k) {
            printf("%d\n",f(n,k));
        }
    }
    return 0;
}

转载于:https://www.cnblogs.com/nosta/p/10177343.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值