1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| #include <bits/stdc++.h> #define MAXN 50005 using namespace std; const double PI=acos(-1.0); inline int read(){ int x=0,f=1; char ch=getchar(); while (ch<'0'||ch>'9'){ if (ch=='-') f=-1; ch=getchar(); } while (ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^'0'); ch=getchar(); } return x*f; } struct Complex{ double x,y; }; inline Complex operator + (const Complex &A,const Complex &B){ return Complex{A.x+B.x,A.y+B.y}; } inline Complex operator - (const Complex &A,const Complex &B){ return Complex{A.x-B.x,A.y-B.y}; } inline Complex operator * (const Complex &A,const Complex &B){ return Complex{A.x*B.x-A.y*B.y,A.x*B.y+A.y*B.x}; } int r[MAXN]; inline void FFT(Complex *A,int n,int type){ for (register int i=0;i<n;++i) if (i<r[i]) swap(A[i],A[r[i]]); for (register int i=1;i<n;i<<=1){ int R=(i<<1); Complex Wn=Complex{cos(2*PI/R),type*sin(2*PI/R)}; for (register int j=0;j<n;j+=R){ Complex w=Complex{1,0}; for (register int k=0;k<i;++k,w=w*Wn){ Complex x=A[j+k],y=w*A[i+j+k]; A[j+k]=x+y; A[i+j+k]=x-y; } } } } struct Poly{ int num[MAXN]; }; Poly F,G,org,temp; int sz,m,n,o,s,u,L,mod; inline int f(int x){ return (o*x*x%mod+s*x%mod+u)%mod; } Complex a[MAXN],b[MAXN]; inline void Mul(Poly &des,const Poly &A,const Poly &B){ for (register int i=0;i<=sz;++i) a[i]=Complex{(double)A.num[i],0},b[i]=Complex{(double)B.num[i],0}; FFT(a,sz,1),FFT(b,sz,1); for (register int i=0;i<=sz;++i) a[i]=a[i]*b[i]; FFT(a,sz,-1); for (register int i=1;i<=m;++i) des.num[i]=((int)(a[i].x/sz+0.5))%mod; } inline void Add(Poly &A,const Poly &B){ for (register int i=1;i<=m;++i) A.num[i]=(A.num[i]+B.num[i])%mod; } inline void Init(int m){ sz=1,L=0; while (sz<=2*m) sz<<=1,L++; for (register int i=0;i<=sz;++i){ r[i]=(r[i>>1]>>1|((i&1)<<(L-1))); } } inline void ksm(int n){ if (n==1){ F=org,G=org; return ; } ksm(n>>1); Mul(temp,F,G); Add(F,temp); Mul(G,G,G); if (n&1){ Mul(G,G,org); Add(F,G); } } int main(){ m=read(),mod=read(); Init(m); n=read(),o=read(),s=read(),u=read(); for (register int i=1;i<=m;++i) org.num[i]=f(i); ksm(n); printf("%d\n",F.num[m]); }
|