#include<cstdio>usingnamespacestd;constexprintmod=1000000007;intmodadd(inta,intb){if(a+b>=mod)returna+b-mod;// 减法代替取模,加快运算returna+b;}intvi[1000005];intgo[75][1000005];// 将数组稍微开大以避免越界,小的一维尽量定义在前面intsum[75][1000005];intmain(){intn,k;scanf("%d%d",&n,&k);for(inti=1;i<=n;++i){scanf("%d",vi+i);}for(inti=1;i<=n;++i){go[0][i]=(i+k)%n+1;sum[0][i]=vi[i];}intlogn=31-__builtin_clz(n);// 一个快捷的取对数的方法for(inti=1;i<=logn;++i){for(intj=1;j<=n;++j){go[i][j]=go[i-1][go[i-1][j]];sum[i][j]=modadd(sum[i-1][j],sum[i-1][go[i-1][j]]);}}longlongm;scanf("%lld",&m);intans=0;intcurx=1;for(inti=0;m;++i){if(m&(1ll<<i)){// 参见位运算的相关内容,意为 m 的第 i 位是否为 1ans=modadd(ans,sum[i][curx]);curx=go[i][curx];m^=1ll<<i;// 将第 i 位置零}}printf("%d\n",ans);}