Codeforces Round #179 (Div. 2)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c015ffd22722356c70b65f4b55e4894c.png)
- 题目翻译:(from洛谷)
![from洛谷](https://i-blog.csdnimg.cn/blog_migrate/e7474c5a1634f45a3c05c0ca7569f37d.png)
- 分析
首先要注意到,所有的情况中,对于所有1<=i<=n,都有
1.s[i] >= w[i] 或
2.s[i] <= w[i]
那么这样的序列是不合法的。
所以可以先把所有的组合情况算出来设为ans,并且算出1、2两种情况的序列数目分别为res1、 res2,最后减去以上两种情况的序列数目。
答案就是ans - res1 - res2吗?
并不是,1和2两种情况并不是完全互斥的,他们都包含了一个
3.s[i] == w[i]
所以还需要将这种情况也算出来。记为res3。
所以答案就是 ans - res1 - res2 + res3。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll mod = 1000000007;
int main()
{
int n;
string s1, s2;
cin >> n;
cin >> s1 >> s2;
ll ans = 1, res1 = 1, res2 = 1, res3 = 1;
for (int i = 0; i < n; i++)
{
if (s1[i] == '?') ans = ans * 10 % mod;
if (s2[i] == '?') ans = ans * 10 % mod;
}
for (int i = 0; i < n; i++)
{
if (s1[i] == '?' && s2[i] == '?') res1 = res1 * 55 % mod;
else if (s1[i] == '?' && s2[i] != '?') res1 = res1 * ('9' - s2[i] + 1) % mod;
else if (s1[i] != '?' && s2[i] == '?') res1 = res1 * (s1[i] - '0' + 1) % mod;
else if (s1[i] < s2[i]) {res1 = 0; break;}
}
for (int i = 0; i < n; i++)
{
if (s1[i] == '?' && s2[i] == '?') res2 = res2 * 55 % mod;
else if (s1[i] == '?' && s2[i] != '?') res2 = res2 * (s2[i] - '0' + 1) % mod;
else if (s1[i] != '?' && s2[i] == '?') res2 = res2 * ('9' - s1[i] + 1) % mod;
else if (s1[i] > s2[i]) {res2 = 0; break;}
}
for (int i = 0; i < n; i++)
{
if (s1[i] == '?' && s2[i] == '?') res3 = res3 * 10 % mod;
else if (s1[i] != '?' && s2[i] != '?' && s1[i] != s2[i]) {res3 = 0; break;}
}
cout << (ans - res1 - res2 + res3 + 2 * mod) % mod << endl;
return 0;
}