• CodeForces 628 D Magic Numbers 数位DP


    Magic Numbers

    题意:

    题意比较难读:首先对于一个串来说, 如果他是d-串, 那么他的第偶数个字符都是是d,第奇数个字符都不是d。

    然后求[L, R]里面的多少个数是d-串,且是m的倍数。

    题解:

    数位dp。

    dp[x][y]代表的是余数为x, 然后剩下的长度是y的情况的方案数是多少。

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define Fopen freopen("_in.txt","r",stdin); freopen("_out.txt","w",stdout);
    #define LL long long
    #define ULL unsigned LL
    #define fi first
    #define se second
    #define pb push_back
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    #define lch(x) tr[x].son[0]
    #define rch(x) tr[x].son[1]
    #define max3(a,b,c) max(a,max(b,c))
    #define min3(a,b,c) min(a,min(b,c))
    typedef pair<int,int> pll;
    const int inf = 0x3f3f3f3f;
    const int _inf = 0xc0c0c0c0;
    const LL INF = 0x3f3f3f3f3f3f3f3f;
    const LL _INF = 0xc0c0c0c0c0c0c0c0;
    const LL mod =  (int)1e9+7;
    const int N = 2e3 + 100;
    int dp[N][N];
    /// left length
    char s[N];
    int m, d;
    ///      length, yu, lim
    int dfs(int len, int yu, int lim, int g){
        if(!lim && dp[yu][len] != -1) return dp[yu][len];
        if(len == 0){
            return !yu;
        }
        int up = 9;
        if(lim) up = s[len] - '0';
        LL tmp = 0;
        for(int i = 0; i <= up; ++i){
            if(g){
                if(i != d) continue;
            }
            else {
                if(i == d) continue;
            }
            tmp += dfs(len-1, (yu*10+i)%m, lim && (i==up), g^1);
        }
        tmp %= mod;
        if(!lim) dp[yu][len] = tmp;
        return tmp;
    }
    bool check(int len){
        int yu = 0, g = 0;
        for(int i = len; i >= 1; --i){
            if(g && s[i] != '0' + d) return false;
            if(!g && s[i] == '0' + d) return false;
            yu = (yu * 10 + s[i] - '0') % m;
            g ^= 1;
        }
        return yu == 0;
    }
    int main(){
        memset(dp, -1, sizeof(dp));
        scanf("%d%d", &m, &d);
        scanf("%s", s+1);
        int len1 = strlen(s+1);
        reverse(s+1, s+1+len1);
        LL ans = check(len1) - dfs(len1, 0, 1, 0);
        scanf("%s", s+1);
        len1 = strlen(s+1);
        reverse(s+1, s+1+len1);
        ans += mod + dfs(len1, 0, 1, 0);
        ans %= mod;
        cout << ans << endl;
        return 0;
    }
    View Code
  • 相关阅读:
    Docker 我的常用命令
    Docker 已运行容器修改配置
    Docker .NET Core项目run起来
    Docker 安装运行mssql-server-linux
    Docker Mssql 还原数据库到Linux
    Nginx(四)------nginx 负载均衡
    nginx(二)------nginx.conf 配置文件
    Nginx(一)------简介与安装
    MySQL主从复制作用和原理
    设计模式:策略模式
  • 原文地址:https://www.cnblogs.com/MingSD/p/10863221.html
Copyright © 2020-2023  润新知