Loj #6261. 一个人的高三楼

link : https://loj.ac/problem/6261

一看就是一个已经退役的大佬出的题。。。

我一开始还是too young了,忘了看时限,,以为NTT+多项式快速幂就能水过的。。。

于是就写了个我代码里被我注释掉的东西。。。。。

后来被卡了之后才想起来全是1的多项式的N次方的各个项的系数是可以直接用组合数算出来的。。。。

具体的说,设 A = {1,x,x^2,,,,,,,} ^ N 。

A中的 x^i 的系数就是 C(N+i-1,i) ,因为这就是可重组合的定义式吧23333。

而根据组合数的通项公式,我们可以很容易的从 x^i 的系数来递推 x^(i+1) 的系数。

O(N)  计算出 A 之后,直接一遍NTT 让 a卷一下它,得到结果。

写的时候犯了很多SB错误,想想都想打自己23333.

1.一开始求补0之后序列长度的逆元求成补0之前的了,,,虽然这个样例并不能看出来因为样例 4=2^2   2333.

2. 数组大小一定要开到 > 卷积后最高次数 的2^k 。

3.K比较大,,,乘积的时候得先%ha之后再运算233

#include<bits/stdc++.h>
#define ll long long
#define maxn 400005
using namespace std;
const int ha=998244353;
const int root=3;
const int inv=ha/3+1;
ll k;
int a[maxn],b[maxn],n,N;
int INV,e[maxn],r[maxn],l;
int object[2][maxn];
int ni[maxn];

inline int ksm(int x,int y){
	int an=1;
	for(;y;y>>=1,x=x*(ll)x%ha) if(y&1) an=an*(ll)x%ha;
	return an;
}

inline int add(int x,int y){
	x+=y;
	return x>=ha?x-ha:x;
}

inline void NTT(int *c,int f){
	for(int i=0;i<N;i++) if(i<r[i]) swap(c[i],c[r[i]]);

	for(int i=1,o=1;i<N;i<<=1,o++){
		int omega=object[f==-1][o];

		for(int p=i<<1,j=0;j<N;j+=p){
			int now=1;
			for(int u=0;u<i;u++,now=now*(ll)omega%ha){
				int x=c[j+u],y=c[j+u+i]*(ll)now%ha;
				c[j+u]=add(x,y);
				c[j+u+i]=add(x,ha-y);
			}
		}
	}

	if(f==-1) for(int i=0;i<N;i++) c[i]=c[i]*(ll)INV%ha;
}

inline void calc(){
	b[0]=1;
	for(int i=1;i<n;i++) b[i]=b[i-1]*((ll)(k+i-1)%ha)%ha*(ll)ni[i]%ha;
}

inline void solve(){
	int len=(n-1)<<1;
	for(N=1,l=0;N<=len;N<<=1) l++;
	for(int i=0;i<N;i++) r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
	for(int i=1;i<=l;i++){
		object[0][i]=ksm(root,(ha-1)/(1<<i));
		object[1][i]=ksm(inv,(ha-1)/(1<<i));
	}
	INV=ksm(N,ha-2);
	ni[1]=1;
	for(int i=2;i<=n;i++) ni[i]=-ni[ha%i]*(ll)(ha/i)%ha+ha;

	calc();

	/*
	while(k){
		if(k&1){
			NTT(a,1),NTT(b,1);
			for(int i=0;i<N;i++) a[i]=a[i]*(ll)b[i]%ha;
			NTT(a,-1),NTT(b,-1);
			fill(a+n,a+N,0);
		}

		NTT(b,1);
		for(int i=0;i<N;i++) b[i]=b[i]*(ll)b[i]%ha;
		NTT(b,-1);
		fill(b+n,b+N,0);
		k>>=1;
	}
	*/

	NTT(a,1),NTT(b,1);
	for(int i=0;i<N;i++) a[i]=a[i]*(ll)b[i]%ha;
	NTT(a,-1);
}

int main(){
	scanf("%d%lld",&n,&k);
	for(int i=0;i<n;i++){
		scanf("%d",a+i);
	}

	solve();

	for(int i=0;i<n;i++) printf("%d\n",a[i]);
	return 0;
}

  

原文地址:https://www.cnblogs.com/JYYHH/p/8541390.html

时间: 2024-11-06 09:28:08

Loj #6261. 一个人的高三楼的相关文章

XJOI 高三楼

参观完各种饭堂,学校还有什么著名的景点呢?当然是教室了,此时此刻我 们来到了高三楼.你会发现高三楼门口会有以身份认证系统,这东西还有着一段疼人的历史.每年的九月到来,高三的童鞋大多不习惯学校的作息时间,有人迟到的情况在所难免,2013 届的moreD 同志作为当年的纪检部部长,创造了一种十分厉害的身份认证系统.他会给每位童鞋的饭卡加上一个电子认证信息:一个n*n的矩阵,其中,每行每列都有两个特殊的点.moreD 同志设计的身份认证系统会把这些矩阵读进来,并且对此进行解析,由于每个同学都带有独特的

「loj#6261」一个人的高三楼

题目 显然存在一个这样的柿子 \[S^{(k)}_i=\sum_{j=1}^iS^{(k-1)}_j\] 我们可以视为\(S^{(k)}\)就是由\(S^{(k-1)}\)卷上一个长度为\(n\)全是\(1\)的多项式得来的 设这样的全是\(1\)的多项式为\(A\),给出的多项式为\(F\)我们要求的就是\(F\times A^k\) 发现\(k\)非常大,我们可以考虑把我们要求的东西变成\(F\times \exp(k\ln\ A)\),复杂度\(O(nlog n)\) 之后我就本着复习的想

JDFZ 1112 高三楼 数的划分

题意:链接 方法:数的划分 解析: 我终于A了这道题了!! 百年老坑!!!!!! 首先我承认这个玩意暴力我都不会写. 或者暴力复杂度爆炸. 看上面这个图,这是个7*7的矩阵 显然他可以由2,2,3来表示(RT); 但是这里它划分出来的三个矩阵的表示方法必须是独有的. 什么是独有的呢?以边长为4的矩阵演示一下. 显然有两种填充方案.如下图. 但是第一种填充方案显然是由两个边长为2的矩阵构成的,不是他独有的方案. 第二种填充方案便是它独有的填充方案,因为在这种填充方案中.找不到一个大小为i(i 因为

一个人的高三楼

题目链接:Click here Solution: 题目名字有点伤感啊... 直接看题吧,\(k\)次前缀和,瞬间想到\(O(nk)\)的做法,20pts到手了,走吧! 回到正题...不难想到,我们构造一个生成函数\(G(x)=\sum_{i=0}^n x^i\),同时有\(A(x)=\sum_{i=1}^n a_ix^i\) 那么\(A\times G\)就相当于对\(A\)做了一次前缀和了,那么\(S_n^k=A\times G^k\),难道要多项式快速幂? 多项式快速幂是不可能的,这辈子都

小机房的树——LCA 启蒙题

大概从一个月前的学考准备阶段就没好好干过什么事,五月底六月初因为要突击文科而削减了奥赛,班主任也说中午暂时别去机房.然后高考放假在家里准备炎德(间断地打了十五盘Dota 2,十五盘是凤凰,输了三盘),本来带了几本文科的资料但是没动.高考完了我们会学校学考.学考完那天下午只有一堂英语,于是我就一个人待在机房,考完回寝室听人说班主任中午说晚上要考试.然后就考试,用十三号和十四号两天的晚自习考了高考卷子(湖南的全国卷乙).成绩是语文一百,数学九十一,英语一百三十五(其实当时因为时间关系而没有做听力,我

英语:漏屋-英语学习的真实方法及误区分析(转)

前 言 著名语言学家Greg Thomson说的:“外语学习的原理是如此之复杂,以至于没有人能说清楚:但掌握语言的过程又是如此之简单,以至于不需要说清楚.”讨论语言学习的原 理,是件非常复杂的事,在下当然也没把握能描述得很清楚.而且因为外语学习就连学术界都存在很多尖锐的争论,本人也不敢说自己有把握能把争论化解.但还是 决定先从简单入手,做些抛砖引玉的工作吧,探讨一下外语学习的真谛,特别是对大家在外语学习上普遍存在的误解进行分析和澄清,希望能对外语学习者有所帮 助,对外语教学工作着有所启发,就知足

云南高利特农业科技有限公司房奴

杨洁篪脱北者,云南高利特农业科技有限公司,近年来,在中央的统一领导下,在各部门.各地方的密切配合下,我们及时妥善处置了涉及在海外的中国公民和机构的领保和协助案件数十万起,组织实施了涉及数万海外同胞的重大撤离粉丝动,切实维护公民和法人的海外合法权益. 中新网3月9日电 外交部长杨洁篪今日谈及海外领事保护工作时说,我们的目老人暴打未让座女孩 就是要确保我们的公民"高高兴兴地走出去,平平安安地回家来". 杨洁篪说,我们的目锤子手机 就是要确保我们的公民"高高兴兴地走出去,平平安安地

北京整治建筑物屋顶广告牌匾 高反光材料将禁用n7

未来,根据市场情况,基金可相应调整和更新相关投资策略,并在招募说明书更新中公告.熊武(笔名龙山人),1961年9月出生于江苏淮安,大专文化,罗山县九届政协委员,信阳市政协书画院理事.无论上诉人怎么辩解,无论二审法院如何裁量,都绝不可能出现第四种结果!如果美国能有一些农业种植业研究机构和云南的大学.农科院等机构建立起长期稳定的合作关系,对双方来说就是'双赢'地检官莱恩表示,作案手段和死亡原因仍有待法医鉴定该站建成后,将实现和体育中心公交站的零换乘,同时辐射体育中心.水滴.奥城商业区.天津体育学院.

LOJ #2141. 「SHOI2017」期末考试

题目链接 LOJ #2141 题解 据说这道题可以三分(甚至二分)? 反正我是枚举的 = = 先将t和b数组排序后计算出前缀和, 然后枚举最晚的出成绩时间,每次可以O(1)直接计算调整到该时间所需的代价. 如何计算? 对于学生不满意造成的代价,是 (不满意人数 * 最晚结束时间) - 所有不满的人的t之和; 对于调整老师造成的代价, A < B 时先用A调整 (可用前缀和计算出有多少时间能用来交换,又有多少时间需要被交换)再用B调整仍超出的部分; 否则都用B调整. 真的如高大佬所言是sb题啊 =