[NOWCODER] myh的超级多项式
题面
已知$f_i=(\sum_{j=1}ka_j{v_j}i )\bmod 1004535809$
给定$v_1,v_2,\ldots,v_k,f_1,f_2,\ldots f_k$
求$f_n$
思路
我们考虑构造一个递推式,使得:
$f_n=\sum_{i=1}^k c_i f_{n-i}$
我们把这个$f_n$挪到右边来,令$c_0=1$,得到:
$\sum_{i=0}^k c_i f_{n-i} =0$
即:
$\sum_{i=0}^k c_i \sum_{j=1}^k a_j v_j^{n-i}=0$
这个式子的一个充分条件(可行条件)
$\forall j \in [1,k] \sum_{i=0}^k c_i a_j v_j^{n-i}=0$
把$a_j$挪到前面去,除掉一部分$v_j$的幂,得到这个式子:
$\forall j \in [1,k] \sum_{i=0}^k c_i v_j^{k-i}=0$
令$F(x)=\sum c_{k-i} x^i$,那么我们发现${v}$数组是$F(x)$的所有0点
又因为$c_0=-1$,所以$F(x)=-\prod_{i=1}^k (x-v_i)$
分治FFT求出$F(x)$,然后用$O((n-k)k)$递推(不会TLE)得到$f_n$即可
Code
代码里有一个技巧
因为一段区间得到的n+1个系数的多项式的最高次项一定是1,所以我们可以不保存他
这样分治FFT用长度为n的数组就能保存了
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define MOD 1004535809
#define ll long long
using namespace std;
inline int read(){
int re=0,flag=1;char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') flag=-1;
ch=getchar();
}
while(isdigit(ch)) re=(re<<1)+(re<<3)+ch-'0',ch=getchar();
return re*flag;
}
ll qpow(ll a,ll b){
ll re=1;
while(b){
if(b&1) re=re*a%MOD;
a=a*a%MOD;b>>=1;
}
return re;
}
ll add(ll a,ll b){
a+=b;
return ((a>=MOD)?a-MOD:a);
}
ll dec(ll a,ll b){
a-=b;
return ((a<0)?a+MOD:a);
}
ll g=3,ginv;
namespace NTT{
int lim,cnt,r[400010];
ll A[400010],B[400010];
void ntt(ll *a,ll type){
int i,j,k,mid;ll x,y,w,wn,inv;
for(i=0;i<lim;i++) if(i<r[i]) swap(a[i],a[r[i]]);
for(mid=1;mid<lim;mid<<=1){
wn=qpow(((~type)?g:ginv),(MOD-1)/(mid<<1));
for(j=0;j<lim;j+=(mid<<1)){
w=1;
for(k=0;k<mid;k++,w=w*wn%MOD){
x=a[j+k];y=a[j+k+mid]*w%MOD;
a[j+k]=add(x,y);
a[j+k+mid]=dec(x,y);
}
}
}
if(~type) return;
inv=qpow(lim,MOD-2);
for(i=0;i<lim;i++) a[i]=a[i]*inv%MOD;
}
void init(int n){
int i;
lim=1;cnt=0;
while(lim<=n) lim<<=1,cnt++;
for(i=0;i<lim;i++) r[i]=((r[i>>1]>>1)|((i&1)<<(cnt-1))),A[i]=B[i]=0;
}
}
void mul(){
using namespace NTT;
ntt(A,1);ntt(B,1);int i;
for(i=0;i<lim;i++) A[i]=A[i]*B[i]%MOD;
ntt(A,-1);
}
ll c[100010];//黑科技数组
int n,k;ll v[100010],f[100010];
void solve(int l,int r){
if(l==r){
c[l]=MOD-v[l];
return;
}
int mid=(l+r)>>1,i;
solve(l,mid);solve(mid+1,r);
using namespace NTT;
init(r-l+1);
for(i=0;i<=mid-l;i++) A[i]=c[i+l];
for(i=0;i<r-mid;i++) B[i]=c[i+mid+1];
A[mid-l+1]=B[r-mid]=1;//把没记录的1加上
mul();
for(i=0;i<=r-l;i++) c[l+i]=A[i];//这里不保存1
}
int main(){
n=read();k=read();int i,j;
g=3;ginv=qpow(3,MOD-2);
for(i=1;i<=k;i++) v[i]=read();
for(i=1;i<=k;i++) f[i]=read();
solve(1,k);
for(i=0;i<k;i++) c[i]=c[i+1];
c[k]=1;
for(i=0;i<=k;i++) if(c[i]) c[i]=MOD-c[i];
for(i=0;i<=k/2;i++) swap(c[i],c[k-i]);
for(i=k+1;i<=n;i++){
ll w=0;
for(j=1;j<=k;j++) w+=c[j]*f[i-j]%MOD;
f[i]=w%MOD;
}
printf("%lld\n",f[n]);
}
[NOWCODER] myh的超级多项式的更多相关文章
- 【Cogs2187】帕秋莉的超级多项式(多项式运算)
[Cogs2187]帕秋莉的超级多项式(多项式运算) 题面 Cogs 题解 多项式运算模板题 只提供代码了.. #include<iostream> #include<cstdio& ...
- COGS2187 [HZOI 2015] 帕秋莉的超级多项式
什么都别说了,咱心态已经炸了... question 题目戳这里的说... 其实就是叫你求下面这个式子的导函数: noteskey 其实是道板子题呢~ 刚好给我们弄个多项式合集的说... 各种板子粘贴 ...
- 【HZOI2015】帕秋莉的超级多项式
题面 题目分析 超级模板题: 多项式乘法 多项式求逆 多项式开根 多项式求导 多项式求积分 多项式求对数 多项式求自然对数为底的指数函数 多项式快速幂 代码实现 #include<iostrea ...
- COGS 2189 帕秋莉的超级多项式
放模板啦! 以后打比赛的时候直接复制过来. 说句实话vector的效率真的不怎么样,但是似乎也还行,最主要是……写得比较爽. #include <cstdio> #include < ...
- 多项式求ln,求exp,开方,快速幂 学习总结
按理说Po姐姐三月份来讲课的时候我就应该学了 但是当时觉得比较难加上自己比较懒,所以就QAQ了 现在不得不重新弄一遍了 首先说多项式求ln 设G(x)=lnF(x) 我们两边求导可以得到G'(x)=F ...
- 牛顿迭代,多项式求逆,除法,开方,exp,ln,求幂
牛顿迭代 若 \[G(F_0(x))\equiv 0(mod\ x^{2^t})\] 牛顿迭代 \[F(x)\equiv F_0(x)-\frac{G(F_0(x))}{G'(F_0(x))}(mod ...
- 多项式模板&题目整理
注:多项式的题目,数组应开:N的最近2的整数次幂的4倍. 多项式乘法 FFT模板 时间复杂度\(O(n\log n)\). 模板: void FFT(Z *a,int x,int K){ static ...
- 省选前的th题
沙茶博主终于整完了知识点并学完了早该在NOIP之前学的知识们 于是终于开始见题了,之前那个奇怪的题单的结果就是这个了 题目按沙茶博主的做题顺序排序 个人感觉(暂时)意义不大的已被自动忽略 洛谷 491 ...
- nowcoder 181045 / 克洛涅的多项式 构造+思维
题意:有多项式 $F(x),G(x)$,最高次项分别为 $n,m$.$F(x)$ 最高次项系数为 $1$. $m<n$ 给定 $n$ 个不同的点值,满足 $F(x[i])=G(x[i])$ 给定 ...
随机推荐
- 03-UI控件浏览
UI控件浏览 可能用得上的UI控件 为了便于开发者打造各式各样的优秀app,UIKit框架提供了非常多功能强大又易用的UI控件 下面列举一些在开发中可能用得上的UI控件(红色表明最常用,蓝色代表一般, ...
- ARC下需要注意的内存问题
之前发了一篇关于图片加载优化的文章,还是引起很多人关注的,不过也有好多人反馈看不太懂,这次谈谈iOS中ARC的一些使用注意事项,相信做iOS开发的不会对ARC陌生啦.这里不是谈ARC的使用,只是介绍下 ...
- 可复用 React 的 HOC 以及的 Render Props
重复是不可能的,这辈子都不可能写重复的代码 当然,这句话分分钟都要被产品(领导)打脸,真的最后一次改需求,我们烦恼于频繁修改的需求 虽然我们不能改变别人,但我们却可以尝试去做的更好,我们需要抽象,封装 ...
- 浅谈PHP中的数组和JS中的数组
最近在做前后端对接的时候,遇到一个问题,前端要求返回的数据格式是左边的,但是我通过json_encode返回到的数据格式是右边的 注意:数据格式从"[]"(数组)变成了&quo ...
- PAT (Basic Level) Practice 1023 组个最小数
个人练习 给定数字 0-9 各若干个.你可以以任意顺序排列这些数字,但必须全部使用.目标是使得最后得到的数尽可能小(注意 0 不能做首位).例如:给定两个 0,两个 1,三个 5,一个 8,我们得到的 ...
- sql查询平均下单时间
SQL查询订单平均审核时长 今天在写一个sql,需求是算一个订单在执行状态中的各个节点的时长 比如在订单中,状态0为开始接单,状态3为已经审核,那么现在需要计算每个客服的平均审核时长 像图中所示:这个 ...
- Oozie 实战之 shell
说明:使用 shell action 执行 shell 脚本 hive-select-test.sh 来通过已经配置好的 Hive -f 来执行 HQL 查询脚本文件 select.sql 1.创建脚 ...
- Azure Cloud Service - PaaS
使用Azure Cloud Service有一段时间了,前阵子在公司内部做一个Cloud Service培训的时候就在想,能不能用一幅图把Cloud Service所涉及的概念都罗列出来.于是就有了下 ...
- Android面试收集录8 HandlerThread详解
1.前言 我们知道在Android系统中,我们执行完耗时操作都要另外开启子线程来执行,执行完线程以后线程会自动销毁. 想象一下如果我们在项目中经常要执行耗时操作,如果经常要开启线程,接着又销毁线程, ...
- TouTiao开源项目 分析笔记18 视频详情页面
1.效果预览 1.1.需要做到的真实效果 1.2.触发的点击事件 在MediaArticleVideoViewBinder的每一个item点击事件中: VideoContentActivity.lau ...