bzoj 1833 數位dp
阿新 • • 發佈:2018-09-05
bits name col color memset class define turn limit
很裸的數位dp。
#include<bits/stdc++.h> #define LL long long #define fi first #define se second #define mk make_pair #define PII pair<int, int> #define y1 skldjfskldjg #define y2 skldfjsklejg using namespace std; const int N = 2e5 + 7; const int M = 1e7 + 7; const int inf = 0x3f3f3f3f; const LL INF = 0x3f3f3f3f3f3f3f3f; const int mod = 1000000007; LL f[20][20], L, R; int s[20], tot; LL dp(int p, int cnt, bool limit, bool zero, int val) { if(p == -1) return cnt; if(!limit && !zero && ~f[p][cnt]) return f[p][cnt]; LL ans = 0; int up = limit ? s[p] : 9; for(int i = 0; i <= up; i++) { if(!val) ans += dp(p - 1, cnt + (!zero && (!i)), limit && (i == up), zero && (!i), val); else ans += dp(p - 1, cnt + (val == i), limit && (i == up), zero && (!i), val); } if(!limit && !zero) f[p][cnt] = ans;return ans; } LL solve(LL x, int val) { if(x < 1) return 0; tot = 0; for(LL i = x; i; i /= 10) s[tot++] = i % 10; memset(f, -1, sizeof(f)); return dp(tot - 1, 0, 1, 1, val); } int main() { scanf("%lld%lld", &L, &R); for(int i = 0; i < 10; i++) { printf("%lld ", solve(R, i) - solve(L - 1, i)); } puts(""); return 0; } /* */
bzoj 1833 數位dp