zoukankan      html  css  js  c++  java
  • CodeForces 628D Magic Numbers (数位DP)

    题意:求给定区间内偶数位置全是d并且是m的倍数的数的个数。

    析:一开始以为是偶数有的是d,有的不是,然后还没有看到区间的长度相等,这个是十分重要的,要不然开不出数组。

    dp[i][j] 表示前 i 位,取模m为 j。

    代码如下:

    #pragma comment(linker, "/STACK:1024000000,1024000000")
    #include <cstdio>
    #include <string>
    #include <cstdlib>
    #include <cmath>
    #include <iostream>
    #include <cstring>
    #include <set>
    #include <queue>
    #include <algorithm>
    #include <vector>
    #include <map>
    #include <cctype>
    #include <cmath>
    #include <sstream>
    #include <stack>
    //#include <tr1/unordered_map>
    #define freopenr freopen("in.txt", "r", stdin)
    #define freopenw freopen("out.txt", "w", stdout)
    using namespace std;
    //using namespace std :: tr1;
    
    typedef long long LL;
    typedef pair<int, int> P;
    const int INF = 0x3f3f3f3f;
    const double inf = 0x3f3f3f3f3f3f;
    const LL LNF = 0x3f3f3f3f3f3f;
    const double PI = acos(-1.0);
    const double eps = 1e-8;
    const int maxn = 2e3 + 5;
    const int mod = 1e9 + 7;
    const int N = 1e6 + 5;
    const int dr[] = {-1, 0, 1, 0, 1, 1, -1, -1};
    const int dc[] = {0, 1, 0, -1, 1, -1, 1, -1};
    const char *Hex[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
    inline LL gcd(LL a, LL b){  return b == 0 ? a : gcd(b, a%b); }
    int n, m;
    const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    inline int Min(int a, int b){ return a < b ? a : b; }
    inline int Max(int a, int b){ return a > b ? a : b; }
    inline LL Min(LL a, LL b){ return a < b ? a : b; }
    inline LL Max(LL a, LL b){ return a > b ? a : b; }
    inline bool is_in(int r, int c){
        return r >= 0 && r < n && c >= 0 && c < m;
    }
    LL dp[maxn][maxn];
    int a[maxn];
    char s[maxn], t[maxn];
    int k, len;
    
    LL dfs(int pos, int val, bool ok){
        if(pos == len)  return val == 0;
        LL &ans = dp[pos][val];
        if(!ok && ans >= 0)  return ans;
    
        LL res = 0;
        int n = ok ? a[pos] : 9;
        for(int i = 0; i <= n; ++i){
            if((pos&1) && i != m)  continue;
            if(!(pos&1) && i == m)  continue;
            res = (res + dfs(pos+1, (val*10+i)%k, ok && i == n)) % mod;
        }
        return ok ? res : ans = res;
    }
    
    LL solve(char *s){
        for(len = 0; s[len]; ++len)
            a[len] = s[len] - '0';
        return dfs(0, 0, true);
    }
    
    bool judge(char *s){
        int val = 0;
        for(int i = 0; s[i]; ++i){
            if((i&1) && s[i] - '0' != m)  return false;
            else if(!(i&1) && s[i] - '0' == m)  return false;
            val = (val * 10 + s[i] - '0') % k;
        }
        return val == 0;
    }
    
    int main(){
        while(scanf("%d %d", &k, &m) == 2){
            memset(dp, -1, sizeof dp);
            scanf("%s %s", s, t);
            cout << (solve(t) - solve(s) + judge(s) + mod) % mod << endl;
        }
        return 0;
    }
    
  • 相关阅读:
    【今日CV 视觉论文速览】 19 Nov 2018
    【numpy求和】numpy.sum()求和
    【今日CV 视觉论文速览】16 Nov 2018
    【今日CV 视觉论文速览】15 Nov 2018
    poj 2454 Jersey Politics 随机化
    poj 3318 Matrix Multiplication 随机化算法
    hdu 3400 Line belt 三分法
    poj 3301 Texas Trip 三分法
    poj 2976 Dropping tests 0/1分数规划
    poj 3440 Coin Toss 概率问题
  • 原文地址:https://www.cnblogs.com/dwtfukgv/p/5958452.html
Copyright © 2011-2022 走看看