蒟蒻AC后的疑问
查看原帖
蒟蒻AC后的疑问
683768
Allen_yang楼主2023/8/19 14:44

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 --删除,为什么就过不了样例了呢?求大佬解惑

2023/8/19 14:44
加载中...