ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

J-Melborp Elcissalc

2022-08-11 02:05:21  阅读:134  来源: 互联网

标签:Elcissalc 前缀 子段 ll 数组 序列 整除 Melborp


题意

有一个长度为\(n\)的序列,每个位置可以填\(0\)到\(m-1\)之间的一个数,求有多少种构造序列的方式,使得构造出来的序列恰有\(t\)个连续子段满足和可以被\(m\)整除

\(1\leq{n,m}\leq64,0\leq{t}\leq\frac{n(n+1)}{2}\)

题解

本题的关键是要想到区间\([l,r]\)的和能被\(k\)整除,等价于序列的前缀和数组的第\(l-1\)和第\(r\)位在模\(m\)意义下相等(前缀和数组的第0位应该被视作0,不能忽略),又因为序列和它的前缀和数组是一一对应的,所以我们构造的是实际上是前缀和数组

给定一个确定的序列,求序列有多少连续子段和可以被\(k\)整除。

设\(cnt_i\)表示\(i\)在序列的前缀和数组中出现的次数,上述问题的答案显然为\(\sum_{i=0}^nC_{cnt_i}^2\)

基于以上分析,设\(f_{ijk}\)表示填\(0\)到\(i\)之间的数,序列长度为\(j\),有\(k\)个连续子段能被\(m\)整除,枚举序列中\(i\)的数量,容易得到转移方程为

\(f[i][j][k]=\sum_{l=0}^{j}C_j^lf[i-1][j-l][k-C_l^2],k\geq{C_l^2}\)

注意边界的初始值,注意这题组合数比较小,可以预处理存下来,转移时进行适当剪枝,就可以通过极限数据

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=70,mod=998244353;
ll n,m,t,f[N][N][N*N];
ll C[N][N];
void init(){
    ll i,j;
    C[0][0]=1;
    for(i=1;i<=64;++i){
        for(j=0;j<=i;++j){
            C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
        }
    }
}
int main(){
    init();
    ll i,j,k,l;
    scanf("%lld%lld%lld",&n,&m,&t);
    for(i=1;i<=n;++i){
        f[0][i][i*(i+1)/2]=1;
    }
    for(i=0;i<=m-1;++i){
        f[i][1][0]=i,f[i][1][1]=1;
    }
    for(i=0;i<=m-1;++i){
        f[i][0][0]=1;
    }
    for(i=1;i<=m-1;++i){
        for(j=2;j<=n;++j){
            for(k=0;k<=min(t,j*(j+1)/2);++k){
                for(l=0;l<=j;++l){
                    if(k<C[l][2]) continue;
                    f[i][j][k]=(f[i][j][k]+C[j][l]*f[i-1][j-l][k-C[l][2]])%mod; 
                }
            }
        }
    }
    printf("%lld\n",f[m-1][n][t]);
    return 0;
}

标签:Elcissalc,前缀,子段,ll,数组,序列,整除,Melborp
来源: https://www.cnblogs.com/DGJG/p/16574498.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有