D. Fafa and Ancient Alphabet

题解:

我们可以推出公式 p i ∗ p i − 1 p_i*p_{i-1} pipi1这个公式累加起来,直到我们遇见两个字符串的第i个位置是两个字母都是确定的时候, p i p_i pi代表的是当前a字母大于b字母的概率乘以前面字母都相同的概率。

#include 
using namespace std;
#define int long long
const int mod=1e9+7;
typedef long long ll;
const int N = 1e5+10;
int a[N],b[N];
int qmi(int a,int b)
{
     
    int res=1;
    while (b){
     
        if(b&1) res=res*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return res%mod;
}
void solve()
{
     
    int n,m; scanf("%lld%lld",&n,&m);
    for(int i=1;i<=n;i++) scanf("%lld",a+i);
    for(int i=1;i<=n;i++) scanf("%lld",b+i);
    int ans=0,p=1;
    int invm=qmi(m,mod-2);
    for(int i=1;i<=n;i++){
     
        if(a[i]&&b[i]){
     
            if(a[i]>b[i])   {
     ans+=p,ans%=mod;break;}
            else if(a[i]<b[i])  break;
        }else if(!a[i]&&b[i]){
     
            ans+=p*invm%mod*(m-b[i])%mod;
            p=p*invm%mod;
        }else if(a[i]&&!b[i]){
     
            ans+=p*invm%mod*(a[i]-1)%mod;
            p=p*invm%mod;
        }else if(!a[i]&&!b[i]){
     
            ans+=p*(m-1)%mod*qmi(2*m,mod-2)%mod;
            p=p*invm%mod;
        }
    }
    printf("%lld\n",ans%mod);
}
signed main(){
     
//    memset(head,-1,sizeof head);
    solve();
#ifndef ONLINE_JUDGE
    cerr << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";
#endif
    return 0;
}

你可能感兴趣的:(数学,codeforces)