题目链接:点击查看

题目大意:给出 nnn 个连续的小球,每次可以选择单独的一个或者相邻的两个小球分成一组,允许有剩余的小球,问恰好分成 k∈{1,2,3,⋯,m}k\in\{1,2,3,\cdots,m\}k∈{1,2,3,⋯,m} 组的方案数分别是多少。

题目分析:设 dp[i][j]dp[i][j]dp[i][j] 为前 iii 个小球分成 jjj 组的方案数,不难推出:
dp[i][j]=dp[i−1][j]+dp[i−1][j−1]+dp[i−2][j−1]dp[i][j]=dp[i-1][j]+dp[i-1][j-1]+dp[i-2][j-1]dp[i][j]=dp[i−1][j]+dp[i−1][j−1]+dp[i−2][j−1]

由于不会特征方程求解通项公式,只会用矩阵快速幂套多项式优化上述过程,时间复杂度 O(mlog⁡nlog⁡m)O(m\log n\log m)O(mlognlogm),比赛时无论如何卡常都 TLETLETLE,但是补题的时候交了一发很神奇的卡常卡过去了,离谱。

然后这个模板在矩阵自乘的时候做了一些小优化,将原本 888 次的 DFTDFTDFT 下降成了 444 次,可以说是优化了很多了。

具体推导可以参考:2021HDU多校8 - 7057 Buying Snacks

一份常数更小的代码:

#include<bits/stdc++.h>
using namespace std;
#define SZ(x) ((int)(x).size())
#define rep(i,a) for(int i=0;i<(a);++i)
#define repi(i,a) for(int i=1;i<=(a);++i)
template<typename T>
inline void write(T x)
{if(x<0){x=~(x-1);putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');
}
typedef long long ll;
const int Inf=0x3f3f3f3f;
const int jt=998244353,rg=3,mlg=20;
void inline add(int &a,int b) {a+=b-jt;a+=(a>>31)&jt;
}
void inline sub(int &a,int b) {a-=b;a+=(a>>31)&jt;
}
void inline mul(int &a,int b) {a=(ll)a*b%jt;
}
int inline Add(int a,int b) {return a+b>=jt?a+b-jt:a+b;
}
int inline Sub(int a,int b) {return a-b<0?a-b+jt:a-b;
}
int inline Mul(int a,int b) {return (ll)a*b%jt;
}
typedef vector<int>Poly;
int inline ksmii(int a,int b) {int res=1;while(b) {if(b&1) {mul(res,a);}mul(a,a);b>>=1;}return res;
}
namespace Fourier {int ho[mlg+1][1<<mlg],omg[mlg+1][1<<mlg],in[mlg+1];void init() {rep(lg,mlg+1) {int N=1<<lg;if(lg) {rep(i,N) {ho[lg][i]=(ho[lg][i>>1]>>1)|((i&1)<<(lg-1));}}int omega=ksmii(rg,(jt-1)>>(lg+1)),ome=1;rep(i,N) omg[lg][i]=ome,mul(ome,omega);in[lg]=ksmii(N,jt-2);}}void inline fft(int a[],int lg,int inv) {int N=1<<lg;rep(i,N) {if(ho[lg][i]<i) {swap(a[i],a[ho[lg][i]]);}}rep(l,lg) {int i=1<<l;for(int j=0;j<N;j+=i<<1) {int *x=a+j,*y=x+i,*o=omg[l],tmp;rep(k,i) {tmp=Mul(*y,*o);*y=Sub(*x,tmp);add(*x,tmp);++x,++y,++o;}}}if(!~inv) {reverse(a+1,a+N);rep(i,N) {mul(a[i],in[lg]);}}}
}int N,M;
int tmp[2][2][1<<mlg],tmq[2][2][1<<mlg],tmr[2][2][1<<mlg];struct Matrix {Poly a[2][2];inline Poly *operator[](int x) {return a[x];}inline const Poly *operator[](int x) const  {return a[x];}inline Matrix operator*(const Matrix &b) const {int ts1=0,ts2=0;rep(i,2) rep(j,2) ts1=max(ts1,SZ(a[i][j]));rep(i,2) rep(j,2) ts2=max(ts2,SZ(b[i][j]));int ts=ts1+ts2,lg=0;while((1<<lg)<ts) ++lg;int N=1<<lg;rep(i,2) rep(j,2) {rep(k,N) tmp[i][j][k]=k<SZ(a[i][j])?a[i][j][k]:0;Fourier::fft(tmp[i][j],lg,1);}rep(i,2) rep(j,2) {rep(k,N) tmq[i][j][k]=k<SZ(b[i][j])?b[i][j][k]:0;Fourier::fft(tmq[i][j],lg,1);}rep(i,2) rep(j,2) rep(k,N) tmr[i][j][k]=0;rep(p,N) rep(i,2) rep(j,2) rep(k,2) add(tmr[i][k][p],Mul(tmp[i][j][p],tmq[j][k][p]));rep(i,2) rep(j,2) Fourier::fft(tmr[i][j],lg,-1);Matrix res;if(ts>M+5) ts=M+5;rep(i,2) rep(j,2) {res[i][j].resize(ts);rep(k,ts) res[i][j][k]=tmr[i][j][k];}return res;}
};
void MUL(Matrix &a){int ts=0;rep(i,2) rep(j,2) ts=max(ts,SZ(a[i][j]));int lg=0;ts*=2;while((1<<lg)<ts) ++lg;int N=1<<lg;rep(i,2) rep(j,2) {rep(k,N) tmp[i][j][k]=k<SZ(a[i][j])?a[i][j][k]:0;Fourier::fft(tmp[i][j],lg,1);}rep(i,2) rep(j,2) rep(k,N) tmr[i][j][k]=0;rep(p,N) rep(i,2) rep(j,2) rep(k,2) add(tmr[i][k][p],Mul(tmp[i][j][p],tmp[j][k][p]));rep(i,2) rep(j,2) Fourier::fft(tmr[i][j],lg,-1);if(ts>M+5) ts=M+5;rep(i,2) rep(j,2) {a[i][j].resize(ts);rep(k,ts) a[i][j][k]=tmr[i][j][k];}
}
inline Matrix ksmii(Matrix a,int b) {Matrix res;rep(i,2) rep(j,2) res[i][j]=i==j?Poly{1}:Poly{};while(b) {if(b&1) {res=res*a;}MUL(a);b>>=1;}return res;
}
Matrix tr,ntr,ini;
void solve() {scanf("%d%d",&N,&M);ntr=ksmii(tr,N);Matrix res=ntr*ini;Poly &ans=res[1][0];repi(i,M) write(ans[i]),putchar(' ');puts("");
}
int main() {Fourier::init();tr[0][0]=Poly{1,1};tr[0][1]=Poly{0,1};tr[1][0]=Poly{1};tr[1][1]=Poly{};ini[0][0]={1,1};ini[1][0]={1};int T=1;while(T--) solve();return 0;
}

2021-2022年度第三届全国大学生算法设计与编程挑战赛(秋季赛)- 分组(矩阵快速幂套NTT优化dp)相关推荐

  1. 2021-2022年度第三届全国大学生算法设计与编程挑战赛(夏季赛)

    2021-2022年度第三届全国大学生算法设计与编程挑战赛(夏季赛) 主要是用于记录涉及的知识点,本次比赛是团队赛. http://oj.saikr.com/contest/20/problems 部 ...

  2. 2021-2022年度第三届全国大学生算法设计与编程挑战赛(冬季赛)题解(7道题)

    只有:B,D,E,G,I,K,L 正文 B:题目链接  Error 题目: 思路:二分 二分给出一个d,先考虑第一个数,让第一个数 r 为max(a[1]-d,0) 而且a[i]太小就直接返回NO,也 ...

  3. 2021-2022年度第三届全国大学生算法设计与编程挑战赛(秋季赛)- 占座位(最小割)

    题目大意:给出一个 n∗mn*mn∗m 的矩阵,每个格子都有两个权值 aaa 和 bbb,分别代表花费和收益.一个格子被占,当且仅当: 格子上有人 格子的上下左右都有人 格子被占可以获得收益 bbb, ...

  4. 2021-2022年度第三届全国大学生算法设计与编程挑战赛(冬季赛)-正式赛 部分题解

    比赛链接 http://oj.saikr.com/contest/19 B.Error 思路 这道题其实我们贪心加上二分就能做了,首先我们贪心得把 b[1]b[1]b[1] 变得很小,然后构造 b[i ...

  5. 【算法】第三届全国大学生算法设计与编程挑战赛(冬季赛)

    7题金,6题银,5题铜 [参考:2021-2022年度第三届全国大学生算法设计与编程挑战赛(冬季赛)题解_int 我的博客-CSDN博客] [参考:2021-2022年度第三届全国大学生算法设计与编程 ...

  6. 2022-2023年度第四届全国大学生算法设计与编程挑战赛(秋季赛)【热身赛】h-4题 花灯

    一.问题描述 二.分析: 此题的问题描述部分的第一句话:"花灯有n个,排列成l行供大家欣赏."中,"排列成l行"应与本题求解无关.由题意可知:n个花灯被均分为块 ...

  7. 第三届全国大学生算法设计与编程挑战赛 (冬季赛)部分题解

    部分题解 树的果实 题目描述 题目思路及代码 Error 题目描述 题目思路及代码 吃利息 题目描述 题目思路及代码 MP4 题目描述 题目思路及代码 展览 题目描述 题目思路及代码 礼物 题目描述 ...

  8. C:勇敢羊羊不怕困难!2022-2023年度第四届全国大学生算法设计与编程挑战赛(秋季赛)之羊驼

    目录 题目分析 程序设计 总体流程 信息输入 递归函数 完整代码 代码分析 题目分析 问题描述如图: 利用函数迭代,找出能走到出口的每一条路,取路径最短的路线. 程序设计 总体流程 输入相应的地图信息 ...

  9. 第三届全国大学生算法设计与编程挑战赛---K题 真假英雄

    真假英雄 Description xxx是一个热衷推理的小朋友.他喜欢看各种本格推理小说,更喜欢自己去参与到推理的过程中,所以每一次去恐怖密室时,他都不在意密室的npc,背景音乐,就是模拟医院里面病床 ...

最新文章

  1. 反射load,loadfile,LoadFrom区别
  2. java this用法_java中this用法小结
  3. 计算机等级考试二级Python讲座(三)
  4. 将Docker image push 到azure
  5. 13 年 29 款手机,从激进到求稳,iPhone 都经历什么?
  6. 智能一代云平台(二):一些事儿!
  7. for each,for in,for of三者区别
  8. 吐血干货,直播首屏耗时400ms以下的优化实践
  9. 前后台进程的本质区别
  10. 复数加减结构体 c语言,C++定义描述复数的结构体类型变量,是想复数的输入输出。设计三个函数实现复数的加法,减法和乘法运算。...
  11. [转]中国七大顶级黑客X档案
  12. 【linux 学习】在Linux中经常用到的cmake、make、make install等命令解析
  13. 相机激光标定算法:从理论到实践
  14. 【蓝桥杯选拔赛真题40】Scratch跳格子 少儿编程scratch蓝桥杯选拔赛真题讲解
  15. Web前端工程师怎么样呢?薪资待遇如何呢?
  16. 5脚耳机插座原理图_【连载十九】手机维修电路基础原理图
  17. 《“通用语”与“兽人语”互译手册》之部落篇
  18. Google面试之快乐智力题(Cracking the Coding Interview)
  19. 《三国志11》版明星头像
  20. Python读取Oracle数据乱码问题解决

热门文章

  1. visual c 语言参考手册pdf,Microsoft-Visual-C-6-0语言参考手册(三).pdf
  2. Nacos命名空间管理
  3. kubernetes-Pod结构
  4. hashCode和equals方法的关系
  5. 大规模服务化对于服务治理的要求
  6. HTTP协议通信原理
  7. 使用try_catch_finally处理流中的异常
  8. 新版本springboot整合@transactional注解
  9. SpringBoot_入门-微服务简介
  10. 设计模式之_Strategy_06