题解 P5050 【【模板】多项式多点求值】

玫葵之蝶

2018-12-17 23:21:01

Solution

脑子想想就知道这种两个log还常数大的题可以暴力艹啊 显然我们可以有一个O(nm)的秦九韶暴力,~~这个不会你就可以退役了~~ 开始卡常: 1.首先加register,能加的都加,出了存系数的那个不加 2.写快读快写,这个也不必非写fread,~~我就没写~~ 3.循环展开,实测4层最优 4.最后开个unsigned long long,你循环展开的过程量就不用取模了 5.写个unordered_map,如果已经算过了,就直接输出(这个貌似没卵用) 然后找个夜深人静的好时候,提交就好了,你就可以AC了 ```cpp #pragma GCC optimize("Ofast") #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<iostream> #include<algorithm> #include<unordered_map> #define LL unsigned long long #define R register using namespace std; inline void read(int &x){ x=0;int f=1;char ch=getchar(); while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0' && ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar(); if(f==-1)x=-x; } char s[20];int cnt; inline void write(int x){ cnt=0; while(x){ s[++cnt]=x%10+'0'; x/=10; } for(R int i=cnt;i;--i)putchar(s[i]); putchar('\n'); } const int N=64005,mod=998244353; unordered_map<int,int> mp; int a[N]; int main(){ R int n,m,i,j,x; R LL b[17],c1,c2,c3,c4,now; read(n);read(m); for(i=0;i<=n;++i)read(a[i]); for(i=1;i<=m;++i){ read(x); if(mp[x]){write(mp[x]);continue;} b[0]=1; for(j=1;j<=16;++j)b[j]=b[j-1]*x%mod; now=a[n]; for(j=n-1;j-15>=0;j-=16){ c1=now*b[16]+a[j]*b[15]+a[j-1]*b[14]+a[j-2]*b[13]; c2=a[j-3]*b[12]+a[j-4]*b[11]+a[j-5]*b[10]+a[j-6]*b[9]; c3=a[j-7]*b[8]+a[j-8]*b[7]+a[j-9]*b[6]+a[j-10]*b[5]; c4=a[j-11]*b[4]+a[j-12]*b[3]+a[j-13]*b[2]+a[j-14]*b[1]; now=(c1+c2+c3+c4+a[j-15])%mod; } for(j=n%16-1;~j;--j)now=(now*x+a[j])%mod; write(mp[x]=now); } return 0; } ```