高精板子
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int MAXLEN=1e3;
const int jinzhi=1e8;
struct BInt {
ll d[MAXLEN+1];
BInt() {memset(d,0,sizeof(d));}
BInt(ll n) {
memset(d,0,sizeof(d));
while(n) {
d[++d[0]]=n%jinzhi;
n/=jinzhi;
}
}
BInt(string str) {
memset(d,0,sizeof(d));
for(int i=str.size()-1;i>=0;i-=8) {
d[0]++;
for(int j=min(7,i);j>=0;j--) {
if(i-j<0) break;
d[d[0]]=d[d[0]]*10+str[i-j]-'0';
}
}
}
BInt operator=(ll n) {
memset(d,0,sizeof(d));
while(n) {
d[++d[0]]=n%jinzhi;
n/=jinzhi;
}
return *this;
}
BInt operator=(string str) {
memset(d,0,sizeof(d));
for(int i=str.size()-1;i>=0;i-=8) {
d[0]++;
for(int j=min(7,i);j>=0;j--) {
if(i-j<0) break;
d[d[0]]=d[d[0]]*10+str[i-j]-'0';
}
}
return *this;
}
void print(string step="\n") {
if(d[0]==0) {
cout<<0<<step;
return;
}
for(int i=d[0];i>=1;i--) {
if(i==d[0]) printf("%lld",d[i]);
else printf("%08lld",d[i]);
}
cout<<step;
}
void read() {
string str;
cin>>str;
memset(d,0,sizeof(d));
for(int i=str.size()-1;i>=0;i-=8) {
d[0]++;
for(int j=min(7,i);j>=0;j--) {
if(i-j<0) break;
d[d[0]]=d[d[0]]*10+str[i-j]-'0';
}
}
}
BInt operator+(BInt n) {
BInt res(0);
int maxl=max(n.d[0],d[0]);
for(int i=1;i<=maxl;i++) {
res.d[i]=d[i]+n.d[i];
}
for(int i=1;i<=maxl;i++) {
res.d[i+1]+=res.d[i]/jinzhi;
res.d[i]%=jinzhi;
}
res.d[0]=maxl+(res.d[maxl+1]>0);
return res;
}
BInt operator-(BInt n) {
BInt res(0);
if(d[0]<n.d[0]) return res;
for(int i=d[0];i>=1;i--) {
res.d[i]=d[i]-n.d[i];
}
for(int i=d[0];i>=1;i--) {
if(res.d[i]<0) {
res.d[i]+=jinzhi;
res.d[i+1]--;
}
}
res.d[0]=d[0]-(res.d[d[0]]==0);
return res;
}
BInt operator*(BInt n) {
BInt res(0);
int len=d[0]+n.d[0]-1;
for(int i=1;i<=d[0];i++) {
for(int j=1;j<=n.d[0];j++) {
res.d[i+j-1]+=d[i]*n.d[j];
}
}
for(int i=1;i<=len;i++) {
res.d[i+1]+=res.d[i]/jinzhi;
res.d[i]%=jinzhi;
}
res.d[0]=len+(res.d[len+1]>0);
return res;
}
BInt operator/(int n) {
BInt res=*this;
for(int i=d[0];i>=1;i--) {
ll q=res.d[i]/n;
ll r=res.d[i]-q*n;
res.d[i]=q;
res.d[i-1]+=r*jinzhi;
}
res.d[0]=d[0]-(res.d[d[0]]==0);
return res;
}
BInt qpow(int n) {
if(n==1) return *this;
BInt t=qpow(n/2);
if(n%2==0) return t*t;
return t*t*(*this);
}
bool operator==(BInt n) {
if(d[0]!=n.d[0]) return 0;
for(int i=1;i<=d[0];i++) {
if(d[i]!=n.d[i]) return 0;
}
return 1;
}
bool operator<(BInt n) {
if(d[0]!=n.d[0]) return d[0]<n.d[0];
for(int i=d[0];i>=1;i--) {
if(d[i]>n.d[i]) return 0;
if(d[i]<n.d[i]) return 1;
}
return 0;
}
bool operator>(BInt n) {
if(d[0]!=n.d[0]) return d[0]>n.d[0];
for(int i=d[0];i>=1;i--) {
if(d[i]<n.d[i]) return 0;
if(d[i]>n.d[i]) return 1;
}
return 0;
}
};
vector<BInt> d(vector<BInt> f) {
if(f.size()==1) {
vector<BInt> res;
res.push_back(0);
return res;
}
vector<BInt> res(f.size()-1);
for(int i=f.size()-1;i>=1;i--) {
res[i-1]=f[i]*i;
}
return res;
}
BInt s(vector<BInt> f,int x) {
BInt w=1,res=0;
for(int i=0;i<f.size();i++) {
res=res+w*f[i];
w=w*x;
}
return res;
}
int main() {
int n,k;
scanf("%d %d\n",&n,&k);
vector<BInt> f(n+1);
scanf("f(x)=");
for(;;) {
int c=0,p=0;
char ch=getchar();
if(ch=='x') {
ch=getchar(); // ^
ch=getchar();
while(ch>='0'&&ch<='9') {
p=p*10+ch-'0';
ch=getchar();
}
f[p]=f[p]+1;
if(ch=='\n') break;
continue;
}
while(ch>='0'&&ch<='9') {
c=c*10+ch-'0';
ch=getchar();
}
ch=getchar(); // ^
ch=getchar();
while(ch>='0'&&ch<='9') {
p=p*10+ch-'0';
ch=getchar();
}
f[p]=f[p]+c;
if(ch=='\n') break;
}
while(k--) f=d(f);
int m;
cin>>m;
while(m--) {
int q;
cin>>q;
s(f,q).print("\n");
}
return 0;
}