【Cogs2187】帕秋莉的超级多项式(多项式运算)
【Cogs2187】帕秋莉的超级多项式(多项式运算)
题面
题解
多项式运算模板题
只提供代码了。。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define RG register
#define MAX 444444
const int MOD=998244353;
const int Phi=MOD-1;
const int gr=3;
inline int read()
{
RG int x=0,t=1;RG char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int fpow(int a,int b)
{
int s=1;
while(b){if(b&1)s=1ll*s*a%MOD;a=1ll*a*a%MOD;b>>=1;}
return s;
}
int r[MAX],N,l,M;
int Og[MAX];
void NTT(int *P,int opt,int n)
{
for(N=1,l=0;N<n;N<<=1)++l;
for(RG int i=0;i<N;++i)r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
for(RG int i=0;i<N;++i)if(i<r[i])swap(P[i],P[r[i]]);
for(RG int i=1;i<N;i<<=1)
{
RG int W=fpow(gr,Phi/(i<<1));Og[0]=1;
for(RG int j=1;j<i;++j)Og[j]=1ll*Og[j-1]*W%MOD;
for(RG int p=i<<1,j=0;j<N;j+=p)
for(RG int k=0;k<i;++k)
{
RG int X=P[j+k],Y=1ll*Og[k]*P[i+j+k]%MOD;
P[j+k]=(X+Y)%MOD;P[i+j+k]=(X+MOD-Y)%MOD;
}
}
if(opt==-1)
{
reverse(&P[1],&P[N]);
for(RG int i=0,inv=fpow(N,MOD-2);i<N;++i)P[i]=1ll*P[i]*inv%MOD;
}
}
int inv[MAX];
void initinv(int N)
{
inv[0]=inv[1]=1;
for(RG int i=2;i<N;++i)inv[i]=1ll*inv[MOD%i]*(MOD-MOD/i)%MOD;
}
int A[MAX],B[MAX];
void Inv(int *a,int *b,int len)
{
if(len==1){b[0]=fpow(a[0],MOD-2);return;}
Inv(a,b,len>>1);
for(RG int i=0;i<len;++i)A[i]=a[i],B[i]=b[i];
NTT(A,1,len<<1);NTT(B,1,len<<1);
for(RG int i=0;i<(len<<1);++i)A[i]=1ll*A[i]*B[i]%MOD*B[i]%MOD;
NTT(A,-1,len<<1);
for(RG int i=0;i<len;++i)b[i]=(b[i]+b[i])%MOD;
for(RG int i=0;i<len;++i)b[i]=(b[i]+MOD-A[i])%MOD;
for(RG int i=0;i<(len<<1);++i)A[i]=B[i]=0;
}
int C[MAX],D[MAX],inv2=fpow(2,MOD-2);
void Sqrt(int *a,int *b,int len)
{
if(len==1){b[0]=sqrt(a[0]);return;}
Sqrt(a,b,len>>1);
for(RG int i=0;i<=len;++i)C[i]=a[i];
Inv(b,D,len);
NTT(C,1,len<<1);NTT(D,1,len<<1);
for(RG int i=0;i<(len<<1);++i)D[i]=1ll*C[i]*D[i]%MOD;
NTT(D,-1,len<<1);
for(RG int i=0;i<len;++i)b[i]=1ll*(b[i]+D[i])%MOD*inv[2]%MOD;
for(RG int i=0;i<=(len<<1);++i)C[i]=D[i]=0;
}
void Dao(int *a,int *b,int len)
{
for(RG int i=1;i<len;++i)b[i-1]=1ll*i*a[i]%MOD;
b[len]=b[len-1]=0;
}
void Jifen(int *a,int *b,int len)
{
for(RG int i=1;i<len;++i)b[i]=1ll*a[i-1]*inv[i]%MOD;
b[0]=0;
}
void Getln(int *a,int *b,int len)
{
int A[MAX],B[MAX];
memset(A,0,sizeof(A));memset(B,0,sizeof(B));
Dao(a,A,len);
Inv(a,B,len);
NTT(A,1,len<<1);NTT(B,1,len<<1);
for(RG int i=0;i<(len<<1);++i)A[i]=1ll*A[i]*B[i]%MOD;
NTT(A,-1,len<<1);
Jifen(A,b,len);
for(RG int i=0;i<(len<<1);++i)A[i]=B[i]=0;
}
int E[MAX];
void Exp(int *a,int *b,int len)
{
if(len==1){b[0]=1;return;}
Exp(a,b,len>>1);
for(RG int i=0;i<len;++i)D[i]=b[i];
Getln(b,E,len);
for(RG int i=0;i<len;++i)E[i]=(MOD-E[i]+a[i])%MOD;E[0]=(E[0]+1)%MOD;
NTT(E,1,len<<1);NTT(D,1,len<<1);
for(RG int i=0;i<(len<<1);++i)D[i]=1ll*D[i]*E[i]%MOD;
NTT(D,-1,len<<1);
for(RG int i=0;i<len;++i)b[i]=D[i];
for(RG int i=0;i<(len<<1);++i)D[i]=E[i]=0;
}
void FastPow(int *a,int *b,int K,int len)
{
int E[MAX];memset(E,0,sizeof(E));
Getln(a,E,len);
for(RG int i=0;i<len;++i)E[i]=1ll*K*E[i]%MOD;
Exp(E,b,len);
}
int X[MAX],Y[MAX];
int n,K;
int main()
{
freopen("polynomial.in","r",stdin);
freopen("polynomial.out","w",stdout);
n=read();K=read();
for(RG int i=0;i<n;++i)X[i]=read();
int N;for(N=1;N<=n;N<<=1);initinv(N);
Sqrt(X,Y,N);memset(X,0,sizeof(X));//for(int i=0;i<n;++i)printf("%d ",Y[i]);puts("");
Inv(Y,X,N);memset(Y,0,sizeof(Y));//for(int i=0;i<n;++i)printf("%d ",X[i]);puts("");
Jifen(X,Y,N);memset(X,0,sizeof(X));//for(int i=0;i<n;++i)printf("%d ",Y[i]);puts("");
Exp(Y,X,N);memset(Y,0,sizeof(Y));//for(int i=0;i<n;++i)printf("%d ",X[i]);puts("");
Inv(X,Y,N);memset(X,0,sizeof(X));Y[0]=(Y[0]+1)%MOD;//for(int i=0;i<n;++i)printf("%d ",Y[i]);puts("");
Getln(Y,X,N);memset(Y,0,sizeof(Y));X[0]=(X[0]+1)%MOD;//for(int i=0;i<n;++i)printf("%d ",X[i]);puts("");
FastPow(X,Y,K,N);memset(X,0,sizeof(X));
Dao(Y,X,n);for(RG int i=0;i<n;++i)printf("%d ",X[i]);puts("");
return 0;
}
【Cogs2187】帕秋莉的超级多项式(多项式运算)的更多相关文章
- COGS2187 [HZOI 2015] 帕秋莉的超级多项式
什么都别说了,咱心态已经炸了... question 题目戳这里的说... 其实就是叫你求下面这个式子的导函数: noteskey 其实是道板子题呢~ 刚好给我们弄个多项式合集的说... 各种板子粘贴 ...
- 【HZOI2015】帕秋莉的超级多项式
题面 题目分析 超级模板题: 多项式乘法 多项式求逆 多项式开根 多项式求导 多项式求积分 多项式求对数 多项式求自然对数为底的指数函数 多项式快速幂 代码实现 #include<iostrea ...
- COGS 2189 帕秋莉的超级多项式
放模板啦! 以后打比赛的时候直接复制过来. 说句实话vector的效率真的不怎么样,但是似乎也还行,最主要是……写得比较爽. #include <cstdio> #include < ...
- P4910 帕秋莉的手环
题目背景 帕秋莉是蕾米莉亚很早结识的朋友,现在住在红魔馆地下的大图书馆里.不仅擅长许多魔法,还每天都会开发出新的魔法.只是身体比较弱,因为哮喘,会在咏唱符卡时遇到麻烦. 她所用的属性魔法,主要是生命和 ...
- [Luogu] P4910 帕秋莉的手环
题目背景 帕秋莉是蕾米莉亚很早结识的朋友,现在住在红魔馆地下的大图书馆里.不仅擅长许多魔法,还每天都会开发出新的魔法.只是身体比较弱,因为哮喘,会在咏唱符卡时遇到麻烦. 她所用的属性魔法,主要是生命和 ...
- cogs 998. [東方S2] 帕秋莉·诺蕾姬
二次联通门 : cogs 998. [東方S2] 帕秋莉·诺蕾姬 交上去后发现自己没上榜 就想着加点黑科技 把循环展开一下 结果WA了.. 万恶的姆Q /* cogs 998. [東方S2] 帕秋莉· ...
- P4915 帕秋莉的魔导书(动态开点线段树)
题目背景 帕秋莉有一个巨大的图书馆,里面有数以万计的书,其中大部分为魔导书. 题目描述 魔导书是一种需要钥匙才能看得懂的书,然而只有和书写者同等或更高熟练度的人才能看得见钥匙.因此,每本魔导书都有它自 ...
- 洛谷 P4910 帕秋莉的手环 矩阵乘法+快速幂详解
矩阵快速幂解法: 这是一个类似斐波那契数列的矩乘快速幂,所以推荐大家先做一下下列题目:(会了,差不多就是多倍经验题了) 注:如果你不会矩阵乘法,可以了解一下P3390的题解 P1939 [模板]矩阵加 ...
- P4915 帕秋莉的魔导书
题目链接 题意分析 当前等级为\(x\)的魔法书会对等级在\([x,inf]\)的所有人造成\(y\)的影响 所以除了求平均值之外 就是区间修改区间求和 需要使用动态开点 + 标记永久化 需要注意的是 ...
随机推荐
- C#Framework4.0支持异步async/await语法
由于用户使用的是XP系统,但是程序里异步都是通过async/await代码来实现的,然而async/await需要Framework4.5版本才可以,而XP系统最高只能支持到Framework4.0, ...
- Python+MySQL开发医院网上预约系统(课程设计)二
---恢复内容开始--- 1:报错 1.1.创建表时报错 CREATE TABLE Admin ( A_ID VARCHAR(20) NOT NULL AUTO_INCREMENT, p ...
- Unity编辑器扩展chapter1
Unity编辑器扩展chapter1 unity通过提供EditorScript API 的方式为我们提供了方便强大的编辑器扩展途径.学好这一部分可以使我们学会编写一些工具来提高效率,甚至可以自制一些 ...
- header field token is not allowed by Access-Control-Allow-Headers in preflight response问题解决
今天下午,本来打算使用aioxs在header里传一个token给后台服务器,如下图所示: 结果,控制台报了如下的错: 然后,我不停地百度,不停的改后台express的header设置,一直没有效果: ...
- XSS留言板实现
XSS 留言板实现-笔记 预备知识 XSS漏洞 XSS攻击全称跨站脚本攻击,是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS ...
- Python基础灬列表&字典生成式
列表生成式 # 求1~10偶数的平方 # 1.常规写法 a_list = [] for i in range(1, 11): if i % 2 == 0: a_list.append(i * i) p ...
- C语言零碎知识点
1. int整形在64位和32位计算机中都占4个字节. 指针在64位占8个字节,32位占4个字节. 2. 数组下标从0开始,a[0]开始,链表下标从1开始,a[1]开始. 3. 条件运算符(con ...
- php新手需要注意的高效率编程
1.尽量静态化: 如果一个方法能被静态,那就声明它为静态的,速度可提高1/4,甚至我测试的时候,这个提高了近三倍. 当然了,这个测试方法需要在十万级以上次执行,效果才明显. 其实静态方法和非静 ...
- 【探路者】互评beta版本
成员博客 1蔺依铭:http://www.cnblogs.com/linym762/ 2张恩聚:http://www.cnblogs.com/zej87/ 3米赫:http://www.cnblogs ...
- jQuery之过滤选择器
在原有选择器匹配的元素中进一步进行过滤的选择器 * 基本 * 内容 * 可见性 * 属性 需求 1. 选择第一个div 2. 选择最后一个class为box的元素 3. 选择所有class属性不为bo ...