传送门
概率dp水题。
题意简述:给你数字表的大小和两个数列,数列中为0的数表示不确定,不为0的表示确定的,求第一个数列字典序比第二个数列大的概率。
f
i
f_i
fi表示第
i
n
i~ n
i n位第一个数列比第二个数列大的概率。
然后分是否为0的情况讨论一下就行了。
代码:
#include<bits/stdc++.h>
#define ri register int
using namespace std;
inline int read(){
int ans=0;
char ch=getchar();
while(!isdigit(ch))ch=getchar();
while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
return ans;
}
const int mod=1e9+7,N=1e5+5;
typedef long long ll;
int n,m,f[N],a[N],b[N],add,inv;
inline int ksm(int a,int p){int ret=1;for(;p;p>>=1,a=(ll)a*a%mod)if(p&1)ret=(ll)ret*a%mod;return ret;}
inline int calc(int a,int b){return (ll)a*ksm(b,mod-2)%mod;}
int main(){
freopen("lx.in","r",stdin);
n=read(),m=read(),add=(ll)m*(m-1)/2%mod,inv=ksm(m,mod-2);
for(ri i=1;i<=n;++i)a[i]=read();
for(ri i=1;i<=n;++i)b[i]=read();
for(ri i=n;i;--i){
if(a[i]&&b[i])f[i]=a[i]==b[i]?f[i+1]:(a[i]>b[i]?1:0);
else if(a[i])f[i]=(ll)(a[i]-1+f[i+1])*inv%mod;
else if(b[i])f[i]=(ll)(m-b[i]+f[i+1])*inv%mod;
else f[i]=(ll)(add+(ll)m*f[i+1]%mod)*inv%mod*inv%mod;
}
cout<<f[1];
return 0;
}