CF755G-PolandBall and Many Other Balls【倍增FFT】

正题

题目链接:https://www.luogu.com.cn/problem/CF755G


题目大意

nnn个东西排成一排,每个组可以选择一个单独的物品或者两个连续的物品,一个物品不同同时在两个组里,但是可以不在组里。对于i∈[1,k]i\in[1,k]i[1,k]求分成iii组的方案数。

1≤n≤109,1≤k<2151\leq n\leq 10^9,1\leq k<2^{15}1n109,1k<215


解题思路

有三种方法。

第一种是倍增FFTFFTFFT,设fi,jf_{i,j}fi,j表示到第iii个物品选了jjj组时的方案数,那么设Fn(x)=∑i=0kfn,ixiF_n(x)=\sum_{i=0}^kf_{n,i}x^iFn(x)=i=0kfn,ixi
考虑把这个FFF分成两半,然后考虑中间的选不选就是
Fn+m(x)=Fn(x)Fm(x)+xFn−1(x)Fm−1(x)F_{n+m}(x)=F_{n}(x)F_m(x)+xF_{n-1}(x)F_{m-1}(x)Fn+m(x)=Fn(x)Fm(x)+xFn1(x)Fm1(x)
我们发现如果需要计算F2kF_{2^k}F2k,那么我们就需要维护F2k−1,F2k−1−1,F2k−1−2F_{2^{k-1}},F_{2^{k-1}-1},F_{2^{k-1}-2}F2k1,F2k11,F2k12这三个东西。
但是这三个东西也可以用来计算F2k−1,F2k−2F_{2^k-1},F_{2^k-2}F2k1,F2k2,所以可以维护这三个东西就行倍增。

然后处理的时候同理维护一个FmF_{m}FmFm−1F_{m-1}Fm1就好了。

时间复杂度O(nlog⁡2n)O(n\log^2 n)O(nlog2n),有点卡常

第二种方法是直接组合数学推导。将这个序列提出若干段,每一段之间间隔为111,那么只有最末尾的段能够长度为222的。
ansk=∑i=1k(n−ik)(ki)ans_k=\sum_{i=1}^k\binom{n-i}{k}\binom{k}{i}ansk=i=1k(kni)(ik)
瓶颈在于后面的(ki)\binom{k}{i}(ik),也就是要求前后没有重复,所以我们可以考虑允许重复的容斥
⇒ansk=∑i=1k(−1)i(ki)(n−ik−i)2k−i\Rightarrow ans_k=\sum_{i=1}^k(-1)^{i}\binom{k}{i}\binom{n-i}{k-i}2^{k-i}ansk=i=1k(1)i(ik)(kini)2ki
⇒∑i=1k(−1)ik!i!(k−i)!(n−i)!(k−i)!(n−k)!2k−i\Rightarrow \sum_{i=1}^k(-1)^i\frac{k!}{i!(k-i)!}\frac{(n-i)!}{(k-i)!(n-k)!}2^{k-i}i=1k(1)ii!(ki)!k!(ki)!(nk)!(ni)!2ki
k!(n−k)!∑i=1k(−1)i(n−i)!i!×2k−i(k−i)!2\frac{k!}{(n-k)!}\sum_{i=1}^k\frac{(-1)^i(n-i)!}{i!}\times \frac{2^{k-i}}{(k-i)!^2}(nk)!k!i=1ki!(1)i(ni)!×(ki)!22ki
就可以卷积了,时间复杂度O(nlog⁡n)O(n\log n)O(nlogn)

第三种方法是特征方程,回到第一个方法的Fn(x)F_n(x)Fn(x),我们有
fi,j=fi−1,j+fi−1,j−1+fi−2,j−1f_{i,j}=f_{i-1,j}+f_{i-1,j-1}+f_{i-2,j-1}fi,j=fi1,j+fi1,j1+fi2,j1
⇒Fn(x)=(1+x)Fn−1(x)+xFn−2(x)\Rightarrow F_n(x)=(1+x)F_{n-1}(x)+xF_{n-2}(x)Fn(x)=(1+x)Fn1(x)+xFn2(x)
这是一个二次项的递推式,过程就不在论述了,用特征方程化简可以得到
Fn(x)=(x+1−x2+6x+12)n+1x2+6x+1(modxn+1)F_{n}(x)=\frac{(\frac{x+1-\sqrt {x^2+6x+1}}{2})^{n+1}}{\sqrt{x^2+6x+1}}(mod\ x^{n+1})Fn(x)=x2+6x+1(2x+1x2+6x+1)n+1(mod xn+1)
然后上全家桶就好了,时间复杂度也是O(nlog⁡n)O(n\log n)O(nlogn)

这里的标程用的是第一种方法。


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define int long long
using namespace std;
const int N=1<<16,P=998244353;
int n,k,m,r[N],f[3][N],t[3][N],g[2][N];
void fm(int &x){x+=x>>31&P;}
int power(int x,int b){int ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
void NTT(int *f,int op){for(int i=0;i<n;i++)if(i<r[i])swap(f[i],f[r[i]]);for(int p=2;p<=n;p<<=1){int tmp=power(3,(P-1)/p),len=p>>1;if(op==-1)tmp=power(tmp,P-2);for(int k=0;k<n;k+=p){int buf=1;for(int i=k,tt;i<(k|len);i++){tt=1ll*buf*f[i|len]%P;fm(f[i|len]=f[i]-tt);fm(f[i]=f[i]+tt-P);buf=1ll*buf*tmp%P;}}}if(op==-1){int invn=power(n,P-2);for(int i=0;i<n;i++)f[i]=1ll*f[i]*invn%P;}return;
}
void print(int x)
{if(x>9)print(x/10);putchar(x%10+'0');return;}
signed main()
{scanf("%d%d",&m,&k);k++;n=1;while(n<(k*2))n<<=1;for(int i=0;i<n;i++)r[i]=(r[i>>1]>>1)|((i&1)?(n>>1):0);f[0][0]=f[0][1]=f[1][0]=g[0][0]=1;for(int d=1;d<=m;d<<=1){if(m&d){for(int j=0;j<3;j++){for(int i=0;i<n;i++)t[j][i]=(i<k)?f[j][i]:0;NTT(t[j],1);}NTT(g[0],1);NTT(g[1],1);for(int i=0;i<n;i++){int b0=g[0][i],b1=g[1][i];g[0][i]=1ll*b0*t[0][i]%P;g[1][i]=1ll*b0*t[1][i]%P;t[0][i]=1ll*t[1][i]*b1%P;t[1][i]=1ll*t[2][i]*b1%P;}NTT(g[0],-1);NTT(g[1],-1);NTT(t[0],-1);NTT(t[1],-1);for(int i=0;i<k-1;i++)(g[0][i+1]+=t[0][i])%=P,(g[1][i+1]+=t[1][i])%=P;for(int i=k;i<n;i++)g[0][i]=g[1][i]=0;}if(d*2>m)break;for(int j=0;j<3;j++){for(int i=0;i<n;i++)t[j][i]=(i<k)?f[j][i]:0;NTT(t[j],1);}for(int i=0;i<n;i++){f[0][i]=1ll*t[0][i]*t[0][i]%P;f[1][i]=1ll*t[1][i]*t[0][i]%P;f[2][i]=1ll*t[1][i]*t[1][i]%P;t[0][i]=1ll*t[1][i]*t[1][i]%P;t[1][i]=1ll*t[1][i]*t[2][i]%P;t[2][i]=1ll*t[2][i]*t[2][i]%P;}for(int j=0;j<3;j++)NTT(f[j],-1),NTT(t[j],-1);for(int i=0;i<k-1;i++)(f[0][i+1]+=t[0][i])%P,(f[1][i+1]+=t[1][i])%P,(f[2][i+1]+=t[2][i])%P;for(int i=k;i<n;i++)f[0][i]=f[1][i]=f[2][i]=0;}for(int i=1;i<k;i++)print(g[0][i]),putchar(' ');return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319093.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Intelligent Warehouse(小米邀请赛)

题目 题意&#xff1a; n个数字&#xff0c;问存在的最长的一组数&#xff0c;使得其中任意两个数的都是倍数关系&#xff0c;问最长的长度是多少 题解&#xff1a; 暴力。。。 没想到暴力就能做&#xff0c;当时就该交上去试试的 用dp[i]表示当期选的所有数都是i的约数且符…

SmartCode.ETL 这不是先有鸡还是蛋的问题!

继国庆节 SmartCode 正式版&#xff08;SmartCode.Generator&#xff09;发布之后&#xff0c;SmartCode 迎来了新的能力 SmartCode.ETL !SmartCode 正式版从开始发布就从未说过自己仅仅是个代码生成器&#xff0c;这点上从我第一次宣布SmartCode正式开源的文章就可以说明&…

codeforces1469 E. A Bit Similar

E. A Bit Similar 代码抄的这份题解 找到一个长度为k的串使得在s长度为k的子串中&#xff0c;对于所有子串答案串都至少有一位相同。也就是如果将s长度为k的子串全部按位取反&#xff0c;那么答案串不能与这些反串匹配。 现在问题转化成&#xff0c;找到一个答案串&#xff…

对拍

参考博客 晚上不想刷题。。无聊的开始研究对拍 以前oi的时候看过对拍&#xff0c;奈何当时水平太差根本用不上对拍&#xff0c;&#xff08;现在水平也不咋地。。&#xff09; 上面那个博文讲的非常好。。 对拍最终的就是 对拍程序.bat 首先第一步&#xff1a;生成一组输入数据…

P7444-「EZEC-7」猜排列【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P7444 题目大意 一个长度为nnn的排列&#xff0c;已知每个cic_ici​表示那个排列中mexmexmex为iii的区间个数。求满足条件的排列个数 1≤n≤5105,ci≥0,∑i1ncin(n1)2−11\leq n\leq 5\times 10^5,c_i\geq 0,\sum_{i1}^nc_i\…

dubbo线程池为什么耗尽

文章概述 大家可能都遇到过DUBBO线程池打满这个问题&#xff0c;报错如下&#xff0c;本文我们就一起分析DUBBO线程池打满这个问题。 cause: org.apache.dubbo.remoting.RemotingException: Server side(10.0.0.100,20881) thread pool is exhausted, detail msg:Thread pool …

手把手教你写DI_0_DI是什么?

DI是什么&#xff1f;Dependency Injection 常常简称为&#xff1a;DI。它是实现控制反转&#xff08;Inversion of Control – IoC&#xff09;的一个模式。fowler 大大大神 “几十年”前的经典文章 https://www.martinfowler.com/articles/injection.html 说的很清楚。“几十…

C++顺序创建txt文件

今天下午在对拍数据的时候感觉好麻烦。。 一次次手调文件名称&#xff0c;突然想起可以直接写段程序集中操作 顺序输出 #include <iostream> #include <fstream> #include<string> using namespace std;int main () {ofstream File;for(int i0;i<3;i){str…

【模板】字符串哈希

ACM模板 目录构建应用构建 字符串哈希就是将字符串映射成一个数&#xff0c;哈希冲突是不可避免的&#xff0c;我们需要选用合适的base尽可能使得哈希冲突可能性降低 unsigned long long溢出后相当于取模&#xff0c;相当于模264−12^{64}-1264−1 get(l,r)函数返回字符串下标…

P5137-polynomial【倍增】

正题 题目链接:https://www.luogu.com.cn/problem/P5137 题目大意 TTT组数据给出n,a,b,pn,a,b,pn,a,b,p求 (∑01naibn−i)%p\left(\sum_{01}^na^ib^{n-i}\right)\%p(01∑n​aibn−i)%p 1≤T≤105,1≤n,a,b,p≤10181\leq T\leq 10^5,1\leq n,a,b,p\leq 10^{18}1≤T≤105,1≤n,a…

使用Visual Studio Code开发.NET Core看这篇就够了

在本文中&#xff0c;我将带着大家一步一步的通过图文的形式来演示如何在Visual Studio Code中进行.NET Core程序的开发&#xff0c;测试以及调试。尽管Visual Studio Code的部分功能还达不到Visual Studio的水平&#xff0c;但它实际上已经足够强大来满足我们的日常开发。而且…

【模板】最大权闭合图

ACM模板 目录概念建图证明模板题概念 闭合图中所有的点的出边必须指向内部的点 建图 原图的边在网络流中的边容量是INF&#xff0c;如果点权是正&#xff0c;那么源点向其连边&#xff0c;容量是点权&#xff1b;否则它向汇点连边&#xff0c;容量是点权绝对值 证明 考虑最…

P4707-重返现世【dp,数学期望,扩展min-max容斥】

正题 题目链接:https://www.luogu.com.cn/problem/P4707 题目大意 nnn个物品&#xff0c;每次生成一种物品&#xff0c;第iii个被生成的概率是pim\frac{p_i}{m}mpi​​&#xff0c;求生成至少kkk种物品的期望次数。 1≤n≤1000,max{n−10,1}≤k≤n,1≤m≤100001\leq n\leq 100…

手把手教你写DI_3_小白徒手支持 Singleton 和 Scoped 生命周期

在上一节&#xff1a;手把手教你写DI_2_小白徒手撸构造函数注入浑身绷带的小白同学&#xff1a;我们继续开展我们的工作&#xff0c;大家都知道 Singleton是什么&#xff0c;就是全局只有一个呗&#xff0c;我们就先从它开始&#xff0c;这个多简单&#xff0c;我们找个字典放这…

监视任务

来源&#xff1a;牛客网 &#xff1a; 时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format: %lld 题目描述 &#x1d445;&#x1d452;&#x1d458;&#x1d456;在课余会接受一些民间的鹰眼…

【模板】最大密度子图

ACM模板 目录概念做法例题概念 选择一个子图G′(V′,E′)G(V,E)G′(V′,E′)&#xff0c;其中对于任意一条边的两个端点必须在所选的点集中&#xff0c;最大化∣E′∣∣V′∣\frac{|E|}{|V|}∣V′∣∣E′∣​ 做法 利用01分数规划二分即最大化 ∣E′∣−g∣V′∣|E|-g|V|∣E…

牛客练习赛79E-小G的数学难题【dp,单调队列】

正题 题目链接:https://ac.nowcoder.com/acm/contest/11169/E 题目大意 给出nnn个三元组(ai,bi,ci)(a_i,b_i,c_i)(ai​,bi​,ci​)。 要求选出一个集合SSS&#xff0c;要求 (∑i∈Sai)≤P,(∑i∈Sbi)≥P\left(\sum_{i\in S}a_i\right)\leq P,\left(\sum_{i\in S}b_i\right)\…

手把手教你写DI_2_小白徒手撸构造函数注入

在上一节&#xff1a;手把手教你写DI_1_DI框架有什么&#xff1f;我们已经知道我们要撸哪些东西了那么我们开始动工吧&#xff0c;这里呢&#xff0c;我们找小白同学来表演下小白同学 &#xff1a;我们先定义一下我们的广告招聘纸有什么&#xff1a;好&#xff0c;我们实现两种…

E. Pattern Matching(题意理解+拓扑排序)

E. Pattern Matching 首先p[mtj]p[mt_j]p[mtj​]必须能够匹配所给字符sjs_jsj​&#xff0c;然后把所有能够匹配的sjs_jsj​的其他模板串也找出来&#xff0c;这些必须放在p[mtj]p[mt_j]p[mtj​]的后面&#xff0c;典型拓扑排序&#xff0c;连边然后排序即可 #define IO ios:…

Sum

链接&#xff1a;https://ac.nowcoder.com/acm/problem/14269 来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format: %lld 题目描述 考虑维护一个这样的问题&#xff1a…