CF935D Fafa and Ancient Alphabet
Description
Solutuon
最开始想着正着推,后来发现太复杂了
注意到末尾到末尾的情况显然更容易讨论,相当于越后放的优先级更高,不用考虑前面放的数的影响
分类转移即可
#include<bits/stdc++.h> using namespace std; #define LL long long inline LL read() { LL f = 1,x = 0; char ch; do { ch = getchar(); if(ch == '-') f = -1; }while(ch < '0'||ch > '9'); do { x = (x<<3) + (x<<1) + ch - '0'; ch = getchar(); }while(ch >= '0'&&ch <= '9'); return f*x; } const int MAXN = 1e5 + 10; const int MOD = 1e9 + 7; inline LL Pow(LL x,LL y) { LL res = 1 ,mul = x; while(y) { if(y&1) res = (res * mul)%MOD; mul = (mul * mul) % MOD; y>>=1; } return res; } inline LL inv(LL x) { return Pow(x,MOD-2); } LL n,m; LL a[MAXN]; LL b[MAXN]; LL dp[MAXN]; LL cnta[MAXN],cntb[MAXN]; LL Inv; int main() { n = read(),m = read(); Inv = inv(m); for(int i=1;i<=n;i++) a[i] = read(); for(int i=1;i<=n;i++) b[i] = read(); for(int i=1;i<=n;i++) if(!a[i]) cnta[i]++; for(int i=1;i<=n;i++) if(!b[i]) cntb[i]++; for(int i=1;i<=n;i++) cnta[i]=cnta[i-1]+cnta[i],cntb[i]=cntb[i-1]+cntb[i]; for(int i=n;i>=1;i--) { // cout << i << " " << a[i] << " " << b[i] << endl; if(a[i]&&b[i]) { // cout << "1" << endl; if(a[i] > b[i]) dp[i] = 1; else if(a[i] == b[i]) dp[i] = dp[i+1]; else dp[i] = 0; } else if(!a[i]&&b[i]) { // cout << "2" << endl; dp[i] = ((dp[i+1] + (m - b[i]))%MOD * Inv)%MOD; } else if(!b[i]&&a[i]) { // cout << "3" << endl; dp[i] = ((dp[i+1] + a[i] - 1)%MOD * Inv)%MOD; } else { //cout << "4" <<endl; dp[i] = (((m * dp[i+1]%MOD + (m * (m-1)/2)%MOD)%MOD * Inv)%MOD)*Inv%MOD; } } cout << dp[1] << endl; }