#倍增FFT#CF755G PolandBall and Many Other Balls
题目
有一排 \(n\) 个球,定义一个组可以只包含一个球或者包含两个相邻的球。
现在一个球只能分到一个组中,求从这些球中取出 \(k\) 组的方案数。
\(n\leq 10^9 ,k<2^{15}\)。
分析
设\(f[n][k]\)表示方案数,则
\]
考虑另一种转移方式就是
\]
如果这些用生成函数\(f_n(x)\)表示的话就是
\]
\]
其实直接用下面这一条二进制拼凑结果即可,需要维护\(f_{n}(x),f_{n-1}(x),f_{n-2}(x)\)
代码
#include <cstdio>
#include <cctype>
#include <cmath>
#include <cstring>
#include <algorithm>
#define rr register
#define mem(f,n) memset(f,0,sizeof(int)*(n))
#define cpy(f,g,n) memcpy(f,g,sizeof(int)*(n))
using namespace std;
const int mod=998244353,inv3=332748118,N=70011;
typedef long long lll; typedef unsigned long long ull;
int n,m,Gmi[31],Imi[31],len,ff[3][N],ans[2][N],gg[3][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);
}
inline signed ksm(int x,int y){
rr int ans=1;
for (;y;y>>=1,x=1ll*x*x%mod)
if (y&1) ans=1ll*ans*x%mod;
return ans;
}
namespace Theoretic{
int rev[N],LAST; ull Wt[N],F[N];
inline void Pro(int n){
if (LAST==n) return; LAST=n,Wt[0]=1;
for (rr int i=0;i<n;++i)
rev[i]=(rev[i>>1]>>1)|((i&1)?n>>1:0);
}
inline void NTT(int *f,int n,int op){
Pro(n);
for (rr int i=0;i<n;++i) F[i]=f[rev[i]];
for (rr int o=1,len=1;len<n;++o,len<<=1){
rr int W=(op==1)?Gmi[o]:Imi[o];
for (rr int j=1;j<len;++j) Wt[j]=Wt[j-1]*W%mod;
for (rr int i=0;i<n;i+=len+len)
for (rr int j=0;j<len;++j){
rr int t=Wt[j]*F[i|j|len]%mod;
F[i|j|len]=F[i|j]+mod-t,F[i|j]+=t;
}
if (o==10) for (rr int j=0;j<n;++j) F[j]%=mod;
}
if (op==-1){
rr int invn=ksm(n,mod-2);
for (rr int i=0;i<n;++i) F[i]=F[i]%mod*invn%mod;
}else for (rr int i=0;i<n;++i) F[i]%=mod;
for (rr int i=0;i<n;++i) f[i]=F[i];
}
inline void trans_ans(){
for (rr int j=0;j<3;++j) cpy(gg[j],ff[j],len);
for (rr int j=0;j<3;++j) mem(gg[j]+n,len-n);
for (rr int j=0;j<3;++j) NTT(gg[j],len,1);
NTT(ans[0],len,1),NTT(ans[1],len,1);
for (rr int i=0;i<len;++i){
rr lll now0=ans[0][i],now1=ans[1][i];
ans[0][i]=now0*gg[0][i]%mod,gg[0][i]=now1*gg[1][i]%mod;
ans[1][i]=now0*gg[1][i]%mod,gg[1][i]=now1*gg[2][i]%mod;
}
NTT(ans[0],len,-1),NTT(ans[1],len,-1);
NTT(gg[0],len,-1),NTT(gg[1],len,-1);
for (rr int j=0;j<2;++j)
for (rr int i=1;i<len;++i)
ans[j][i]=(ans[j][i]+gg[j][i-1])%mod;
for (rr int j=0;j<2;++j) mem(ans[j]+n,len-n);
}
inline void trans(){
for (rr int j=0;j<3;++j) NTT(ff[j],len,1);
for (rr int i=0;i<len;++i){
rr lll now0=ff[0][i],now1=ff[1][i],now2=ff[2][i];
ff[0][i]=now0*now0%mod,gg[0][i]=now1*now1%mod;
ff[1][i]=now0*now1%mod,gg[1][i]=now1*now2%mod;
ff[2][i]=now1*now1%mod,gg[2][i]=now2*now2%mod;
}
for (rr int j=0;j<3;++j)
NTT(ff[j],len,-1),NTT(gg[j],len,-1);
for (rr int j=0;j<3;++j)
for (rr int i=1;i<len;++i)
ff[j][i]=(ff[j][i]+gg[j][i-1])%mod;
for (rr int j=0;j<3;++j) mem(ff[j]+n,len-n);
}
}
inline void GmiImi(){
for (rr int i=0;i<31;++i) Gmi[i]=ksm(3,(mod-1)/(1<<i));
for (rr int i=0;i<31;++i) Imi[i]=ksm(inv3,(mod-1)/(1<<i));
}
signed main(){
m=iut(),n=iut()+1,GmiImi();
for (len=1;len<n*2;len<<=1);
ff[0][0]=ff[1][0]=ff[0][1]=ans[0][0]=1;
for (rr int t=1;t<=m;t<<=1){
if (m&t) Theoretic::trans_ans();
Theoretic::trans();
}
for (rr int i=1;i<n;++i)
print(ans[0][i]),putchar(32);
return 0;
}
#倍增FFT#CF755G PolandBall and Many Other Balls的更多相关文章
- 题解-CF755G PolandBall and Many Other Balls
题面 CF755G PolandBall and Many Other Balls 给定 \(n\) 和 \(m\).有一排 \(n\) 个球,求对于每个 \(1\le k\le m\),选出 \(k ...
- CF755G PolandBall and Many Other Balls/soj 57送饮料
题意:长度为n的序列,相邻两个或单独一个可以划分到一个组,每个元素最多处于一个组. 问恰好分割成k(1<=k<=m)段有多少种方案? 标程: #include<bits/stdc++ ...
- CF755G PolandBall and Many Other Balls 题解
从神 Karry 的题单过来的,然后自己瞎 yy 了一个方法,看题解区里没有,便来写一个题解 一个常数和复杂度都很大的题解 令 \(dp_{i,j}\) 为 在 \(i\) 个球中选 \(j\) 组的 ...
- CF755G-PolandBall and Many Other Balls【倍增FFT】
正题 题目链接:https://www.luogu.com.cn/problem/CF755G 题目大意 \(n\)个东西排成一排,每个组可以选择一个单独的物品或者两个连续的物品,一个物品不同同时在两 ...
- FFT/NTT复习笔记&多项式&生成函数学习笔记Ⅱ
因为垃圾电脑太卡了就重开了一个... 前传:多项式Ⅰ u1s1 我预感还会有Ⅲ 多项式基础操作: 例题: 26. CF438E The Child and Binary Tree 感觉这题作为第一题还 ...
- 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/常用套路【入门】
原文链接https://www.cnblogs.com/zhouzhendong/p/Fast-Fourier-Transform.html 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/ ...
- CodeForces 553E Kyoya and Train 动态规划 多项式 FFT 分治
原文链接http://www.cnblogs.com/zhouzhendong/p/8847145.html 题目传送门 - CodeForces 553E 题意 一个有$n$个节点$m$条边的有向图 ...
- 快速傅里叶变换FFT / NTT
目录 FFT 系数表示法 点值表示法 复数 DFT(离散傅里叶变换) 单位根的性质 FFT(快速傅里叶变换) IFFT(快速傅里叶逆变换) NTT 阶 原根 扩展知识 FFT 参考blog: 十分简明 ...
- 北京培训记day1
数学什么的....简直是丧心病狂啊好不好 引入:Q1:前n个数中最多能取几个,使得没有一个数是另一个的倍数 答案:(n/2)上取整 p.s.取后n/2个就好了 Q2:在Q1条件下,和最小为多少 答 ...
- NOI前的考试日志
4.14 网络流专项测试 先看T1,不会,看T2,仙人掌???wtf??弃疗.看T3,貌似最可做了,然后开始刚,刚了30min无果,打了50分暴力,然后接着去看T1,把序列差分了一下,推了会式子,发现 ...
随机推荐
- mysql日期范围查找(两个日期之间的记录)
转自:https://blog.csdn.net/lzxlfly/article/details/97577575?utm_medium=distribute.pc_relevant_t0.none- ...
- 硬件开发笔记(十): 硬件开发基本流程,制作一个USB转RS232的模块(九):创建CH340G/MAX232封装库sop-16并关联原理图元器件
前言 有了原理图,可以设计硬件PCB,在设计PCB之间还有一个协同优先动作,就是映射封装,原理图库的元器件我们是自己设计的.为了更好的表述封装设计过程,本文描述了CH340G和MAX232芯片封装 ...
- 泛型类Generic注解
在 Python 的 typing 模块中,Generic 是一个泛型类,用于创建参数化的类和函数,以便支持不同类型的参数.它允许你定义具有类型参数的类,这些类型参数在实例化时才确定.这样,你可以在不 ...
- 推荐10款C#开源好用的Windows软件
DevToys 项目简介:DevToys是一个专门为开发者设计的Windows工具箱,完全支持离线运行,无需使用许多不真实的网站来处理你的数据,常用功能有:格式化(支持 JSON.SQL.XML).J ...
- 旅游景点 Tourist Attractions (壮压 DP)题解
简化题意 题目链接--不卡内存班 题目链接--卡内存版 给定 \(n\) 个点和 \(m\) 条边组成的无向图,按照一定限制要求停留 \(2\sim k+1\) 共 \(k\) 个点(可以经过但不停留 ...
- 【Azure 应用服务】如何为Web Jobs 安装Python包呢?
问题描述 WebJobs 怎么安装Python包? 问题解答 第一步:登录到App Service的高级管理工具(Kudu:https://<webappname>.scm.chinacl ...
- python代码,读取一个txt文件,将其中的每一行开头加上一个字母a,每一行的结尾加上一个字母b
with open('name.txt', 'r+') as file: lines = file.readlines() file.seek(0) # 将文件指针移回文件开头 file.trunca ...
- 用CFF Explorer隐藏文件格式
1.首先我们加载两个PNG文件,可以看到 文件格式头部是一样的,我们如何将一个PDF文件格式改成PNG,修改之后的文件虽然含有图片的文件头格式,但是并不能打开. 将PNG的文件头复制写入到PDF文件头 ...
- Failed to instantiate [applets.nature.mapper.LogInfoMapper]: Specified class is an interface-项目启动报错
一.问题由来 周日下午项目在进行测试时,有些东西需要临时修改,自己已经打好一个包部署到测试服务器进行部署.在测试过程中发现一个问题,就是 现在的代码跑起来是没问题的,只是其他人又的东西还没做,所以暂时 ...
- weekToDo - 一个本地todo软件 - 软件推荐 先用着试试
https://weektodo.me/ https://github.com/Zuntek/WeekToDoWeb/releases/download/v1.7.0/WeekToDo-Setup-1 ...