rt,本人在写 P3413 SAC#1-萌数 的时候有这样一个疑问:
AC代码
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const ll Mod = 1e9 + 7;
ll dp[1005][12][12][2][2],len,num[1005];
ll dfs(ll pos,ll last1,ll last2,ll limit,ll lead){
if(pos == len)return 1;
if(dp[pos][last1 + 1][last2 + 1][limit][lead] != -1){
return dp[pos][last1 + 1][last2 + 1][limit][lead];
}
ll mv = 9,ans = 0;
if(limit){
mv = num[pos];
}
for(ll i = 0;i <= mv;i ++){
if(lead == 1){
if(i == 0)ans = (ans + dfs(pos + 1, -1, last1, limit & (i == mv), 1)) % Mod;
else ans = (ans + dfs(pos + 1, i, last1, limit & (i == mv), 0)) % Mod;
}else{
if(i != last1 && i != last2){
ans = (ans + dfs(pos + 1, i, last1, limit & (i == mv), 0)) % Mod;
}
}
}
return dp[pos][last1 + 1][last2 + 1][limit][lead] = ans % Mod;
}
ll work(string a){
memset(dp, -1, sizeof dp);
len = 0;
for(auto it:a){
num[len ++] = it - '0';
}
return dfs(0, -1, -1, 1, 1);
}
int main(){
string a,b;
cin >> a >> b;
ll a1 = work(a),a2 = work(b);
a1 --;
for(ll i = 1;i < a.size();i ++){
if(a[i] == a[i - 1] || (i > 1 && a[i] == a[i - 2])){
a1 ++;
break;
}
}
ll nl = 0,nr = 0;
for(ll i = 0;i < a.size();i ++){
nl = (nl * 10 % Mod + a[i] - '0') % Mod;
}
for(ll i = 0;i < b.size();i ++){
nr = (nr * 10 % Mod + b[i] - '0') % Mod;
}
cout << ((nr - nl + 1) - (a2 - a1) + Mod) % Mod;
return 0;
}
过不了样例的代码
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const ll Mod = 1e9 + 7;
ll dp[1005][12][12][2][2],len,num[1005];
ll dfs(ll pos,ll last1,ll last2,ll limit,ll lead){
if(pos == len)return 1;
if(dp[pos][last1 + 1][last2 + 1][limit][lead] != -1){
return dp[pos][last1 + 1][last2 + 1][limit][lead];
}
ll mv = 9,ans = 0;
if(limit){
mv = num[pos];
}
for(ll i = 0;i <= mv;i ++){
if(lead == 1){
if(i == 0)ans = (ans + dfs(pos + 1, -1, last1, limit & (i == mv), 1)) % Mod;
else ans = (ans + dfs(pos + 1, i, last1, limit & (i == mv), 0)) % Mod;
}else{
if(i != last1 && i != last2){
ans = (ans + dfs(pos + 1, i, last1, limit & (i == mv), 0)) % Mod;
}
}
}
return dp[pos][last1 + 1][last2 + 1][limit][lead] = ans % Mod;
}
ll work(string a){
memset(dp, -1, sizeof dp);
len = 0;
for(auto it:a){
num[len ++] = it - '0';
}
return dfs(0, -1, -1, 1, 1);
}
int main(){
string a,b;
cin >> a >> b;
ll a1 = work(a),a2 = work(b);
for(ll i = 1;i < a.size();i ++){
if(a[i] == a[i - 1] || (i > 1 && a[i] == a[i - 2])){
a1 ++;
break;
}
}
ll nl = 0,nr = 0;
for(ll i = 0;i < a.size();i ++){
nl = (nl * 10 % Mod + a[i] - '0') % Mod;
}
for(ll i = 0;i < b.size();i ++){
nr = (nr * 10 % Mod + b[i] - '0') % Mod;
}
cout << ((nr - nl + 1) - (a2 - a1) + Mod) % Mod;
return 0;
}
可以发现,仅仅是把主函数中的a1 --删除,为什么就过不了样例了呢?求大佬解惑