(⊙o⊙)…今天有点迷啊
T1

- emm。首先p=1,可以直接n∗mn*mn∗m递推,都会吧。有20分。
- 再来考虑p!=1p!=1p!=1的情况。因为f[i][j]=f[i−1][j−1]∗b+f[i−1][j]∗af[i][j]=f[i-1][j-1]*b+f[i-1][j]*af[i][j]=f[i−1][j−1]∗b+f[i−1][j]∗a,所以我们可以一列一列把所有答案求出来,即n∗mn*mn∗m预处理,O(1)O(1)O(1)求。40分get。
- 还是p=1的情况,此时n,m<=500000n,m<=500000n,m<=500000。因此我们需要转换思路。画一个图,给某一行的每一列分别设定一个变量。递推表示一下,你发现,每一个f[1][i]f[1][i]f[1][i]对f[x][y]f[x][y]f[x][y]的贡献,即是f[1][i]f[1][i]f[1][i]本身乘上一个组合数,再乘上一个a的幂次和b的幂次。至于组合数具体是多少呢?很容易推出来,组合数是到达当前点的方案数吧,从上向下走,显然只有斜着走和正下方走,那么组合数为Cx−1y−iC_{x-1}^{y-i}Cx−1y−i。b的幂次即为斜着走的步数,显然为y−iy-iy−i,那么a就是x−1−y+ix-1-y+ix−1−y+i啦。okk,60分get。
- 100分的做法需要我们推一下,当x在p上面时,怎么算。考虑,假设我们要求f(x,y)f(x,y)f(x,y),它等于f(x+1,y)−f(x,y−1)∗ba\frac{f(x+1,y)-f(x,y-1)*b}{a}af(x+1,y)−f(x,y−1)∗b。这其实又变成了一个可以递推的式子,不断分解f(x+1,y)和f(x,y−1)f(x+1,y)和f(x,y-1)f(x+1,y)和f(x,y−1)。直到x=px=px=p停止。这仍然是一个组合数,只不过有正负区别。写一写,显然当列之间距离为奇数时,系数为负。否则为正。因为这次走法不同,只能向左或者向下,所以组合数是Cp−x+y−i−1p−x−1C_{p-x+y-i-1}^{p-x-1}Cp−x+y−i−1p−x−1,减1是因为最后一行不能向左走。从式子中可以看出,b仍然是需要乘的,但是a需要除。b的幂还是y−iy-iy−i,a的幂变成p−x+y−ip-x+y-ip−x+y−i。okk。
p>x,f[x][y]=∑i=1yf[p][i]∗Cp−x+y−i−1p−x−1∗by−iap−x+y−ip>x,f[x][y]=\sum_{i=1}^{y}\frac{f[p][i]*C_{p-x+y-i-1}^{p-x-1}*b^{y-i}}{a^{p-x+y-i}}p>x,f[x][y]=i=1∑yap−x+y−if[p][i]∗Cp−x+y−i−1p−x−1∗by−i
p<x,f[x][y]=∑i=1yf[p][i]∗Cx−py−i∗ax−p−y+i∗by−ip<x,f[x][y]=\sum_{i=1}^{y}f[p][i]*C_{x-p}{y-i}*a^{x-p-y+i}*b^{y-i}p<x,f[x][y]=i=1∑yf[p][i]∗Cx−py−i∗ax−p−y+i∗by−i
Coding
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=15e6+100;
const ll mod=998244353;
ll n,m,a,b,p,q,jie[N],njie[N],inv[N],f[N],posa[N],posb[N];
ll read(){
char ch=getchar();ll num=0,f=1;
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){num=(num<<1)+(num<<3)+(ch^48);ch=getchar();}
return num*f;
}
void work(){
inv[1]=1;
for(ll i=2;i<=n+m;++i){
ll x=-(ll)(mod/i)*inv[mod%i]%mod;
inv[i]=(x+mod)%mod;
}
jie[0]=njie[0]=1;
for(ll i=1;i<=n+m;++i) jie[i]=(ll)jie[i-1]*i%mod,njie[i]=(ll)njie[i-1]*inv[i]%mod;
posa[0]=posb[0]=1;
for(ll i=1;i<=n+m;++i) posa[i]=(ll)posa[i-1]*a%mod,posb[i]=(ll)posb[i-1]*b%mod;
}
ll power(ll a,ll b){
ll res=1%mod;
for(;b;b>>=1){
if(b&1) res=(ll)res*a%mod;
a=(ll)a*a%mod;
}
return res;
}
int main(){
freopen("table.in","r",stdin);
freopen("table.out","w",stdout);
n=read(),m=read(),a=read(),b=read(),p=read(),q=read();
for(ll i=1;i<=m;++i) f[i]=read();
work();
while(q--){
ll x=read(),y=read();
if(x==p) printf("%d\n",f[y]);
else if(x>p){
ll res=0;
for(ll i=1;i<=y;++i){
ll c;
if(x-p<y-i) c=0;
else c=jie[x-p]*njie[y-i]%mod*njie[x-p-y+i]%mod;
res+=(ll)f[i]*posa[x-p-y+i]%mod*posb[y-i]%mod*c%mod;
res=(res+mod)%mod;
}
printf("%lld\n",res);
}else if(x<p){
ll res=0;
for(ll i=1;i<=y;++i){
ll c;
if(p-x+y-i<p-x) c=0;
else c=jie[p-x+y-i-1]*njie[p-x-1]%mod*njie[y-i]%mod;
if((y-i)%2==1) res-=(ll)f[i]*posb[y-i]%mod*c%mod*power(posa[y-i+p-x],mod-2)%mod;
else res+=(ll)f[i]*posb[y-i]%mod*c%mod*power(posa[y-i+p-x],mod-2)%mod;
res=(res+mod)%mod;
}
printf("%lld\n",res);
}
}
return 0;
}
T2与T3,神仙题,咕咕咕