myh的超級多項式
阿新 • • 發佈:2018-12-11
題目大意: 給你,並且已知,求可過。 題解:考慮構造關於的遞推式,也就是要求係數序列,使得:成立。 令,等價於: 其一個充分條件是: 亦即: 令,則上式等價於是的零點,再由可知: 使用分治FFT求出進而得到進而求出即可。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#define p 1004535809
#define N 100010
#define lint long long
#define gc getchar()
#define clr(a,n) memset(a,0,sizeof(int)*(n))
using namespace std;
inline int inn()
{
int x,ch;while((ch=gc)<'0'||ch>'9');
x=ch^'0';while((ch=gc)>='0'&&ch<='9')
x=(x<<1)+(x<<3)+(ch^'0');return x;
}
int a[N<<2],b[N<<2],r[N<<2],c[N],x[N],v[N];vector<int> f[N];
inline int fast_pow(int x,int k,int ans=1) { for(;k;k>>=1,x=(lint)x*x%p) (k&1)?ans=(lint)ans*x%p:0;return ans; }
inline int NTT(int *a,int n,int s)
{
for(int i=1;i<n;i++) if(i<r[i]) swap(a[i],a[r[i]]);
for(int i=2;i<=n;i<<=1)
{
int wn=fast_pow(3,s>0?(p-1)/i:p-1-(p-1)/i);
for(int j=0,t=i>>1;j<n;j+=i) for(int k=0,w=1,x,y;k<t;k++,w=(lint)w*wn%p)
x=a[j+k],y=(lint)w*a[j+k+t]%p,((a[j+k]=x+y)>=p?a[j+k]-=p:0),((a[j+k+t]=x-y)<0?a[j+k+t]+=p:0);
}
if(s<0) { int ninv=fast_pow(n,p-2);for(int i=0;i<n;i++) a[i]=(lint)a[i]*ninv%p; }
return 0;
}
inline int tms(const vector<int> &A,const vector<int> &B,vector<int> &C)
{
int m1=(int)A.size(),m2=(int)B.size();
int n=1,L=0;for(;n<m1+m2-1;n<<=1,L++);
for(int i=1;i<n;i++) r[i]=(r[i>>1]>>1)|((i&1)<<(L-1));
clr(a,n);for(int i=0;i<m1;i++) a[i]=A[i];NTT(a,n,1);
clr(b,n);for(int i=0;i<m2;i++) b[i]=B[i];NTT(b,n,1);
for(int i=0;i<n;i++) a[i]=(lint)a[i]*b[i]%p;NTT(a,n,-1);
C.resize(m1+m2-1);for(int i=0;i<m1+m2-1;i++) C[i]=a[i];
return 0;
}
int solve(int l,int r)
{
if(l==r) return f[l].resize(2),f[l][0]=(v[l]?p-v[l]:0),f[l][1]=1;
int mid=(l+r)>>1;solve(l,mid),solve(mid+1,r),tms(f[l],f[mid+1],f[l]);
return 0;
}
int main()
{
int n=inn(),k=inn();
for(int i=1;i<=k;i++) v[i]=inn();
for(int i=1;i<=k;i++) x[i]=inn(