秦九韶算法
f
(
x
)
=
c
1
x
1
n
+
c
2
x
2
n
−
1
+
.
.
.
+
c
n
x
1
+
c
n
+
1
)
f(x)=c_1x_1^n+c_2x_2^{n-1}+...+c_nx_1+c_{n+1})
f(x)=c1x1n+c2x2n−1+...+cnx1+cn+1)
即
从
后
往
前
,
依
次
乘
,
就
像
快
速
幂
一
样
,
如
果
常
数
位
就
直
接
加
,
然
后
乘
上
x
即从后往前,依次乘,就像快速幂一样,如果常数位就直接加,然后乘上x
即从后往前,依次乘,就像快速幂一样,如果常数位就直接加,然后乘上x
所以这样我们就能算出f(p)
然后我们发现,原式的物理意义就是在n个点中选出不同的k个点
所以我们就可以快速幂计算了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll read(){
char c=getchar();ll ans=0,f=1;
while('0'>c||c>'9') {if(c=='-') f*=-1;c=getchar();}
for(;'0'<=c&&c<='9';c=getchar()) ans=(ans<<3)+(ans<<1)+c-'0';
return ans*f;
}
void print(ll x){
if(x>=10){
print(x/10);
}
putchar('0'+x%10);
}
const ll M=5e5+5,MOD=1e9+7;
ll jc[M];
ll n,m,k,a[M];
ll sum=0,p;
void calc(ll x){
for(int i=m;i>=1;i--){//这里是m,不是n,调了很久
sum=1ll*((sum+(a[i]%MOD))%MOD)*(x%MOD)%MOD;
}
sum=1ll*(sum+(a[0]%MOD))%MOD;
}
ll ksm(ll x,ll pow){
ll ans=1,res=x%MOD;
while(pow){
if(pow&1) ans=(ans)*(res)%MOD;
res=(res*res)%MOD;
pow>>=1;
}
return ans;
}
ll inv(ll x){
return ksm(x,MOD-2)%MOD;
}
int main(){
n=read(),m=read(),k=read(),p=read();
p%=MOD;
if(k==0){puts("0");return 0;}
if(n==k){puts("1");return 0;}
if(n==0){puts("0");return 0;}
if(k>n){puts("0");return 0;}
jc[0]=1;jc[1]=1;
for(ll i=2;i<=n;i++){jc[i]=1ll*jc[i-1]%MOD*(i%MOD)%MOD;}
for(ll i=0;i<=m;i++){a[i]=read();}
calc(p);
ll ans1=inv(jc[n-k]),ans2=inv(jc[k]);
ll ans=((((ans1%MOD)*ans2)%MOD)*(jc[n]%MOD)%MOD)*sum%MOD;
print(ans);
}