蒟蒻求助!数位dp按照y总思路敲为什么只有30pts?

P2602 [ZJOI2010] 数字计数

没必要swap,数据保证a > b不成立; 而且这边定义是longlong,所以printf要用%lld ```然后, 改了就AC``` [AC记录](https://www.luogu.com.cn/record/86962148)
by StkOvflow @ 2022-09-19 13:26:38


@[adolf_stalin](/user/698768) ``` #include <iostream> #include <vector> #define int long long using namespace std; int base[20]; int f[20][20]; int g[20][20]; void init() { base[0] = 1; for(int i = 1 ; i <= 18 ; i++) base[i] = base[i-1]*10; for(int i = 0 ; i <= 9 ; i++) f[1][i] = 1; for(int i = 2 ; i <= 18 ; i++) for(int j = 0 ; j <= 9 ; j++) f[i][j] = f[i-1][j]*10 + base[i-1]; for(int i = 1 ; i <= 9 ; i++) g[1][i] = 1; for(int i = 2 ; i <= 18 ; i++) { g[i][0] = g[i-1][0] + f[i-1][0]*9; for(int j = 1 ; j <= 9 ; j++) g[i][j] = g[i-1][j] + f[i-1][j]*9 + base[i-1]; } } vector<int> dp(int n) { vector<int> ans(10,0); if(n<=0) return ans; vector<int> nums; while(n) nums.push_back(n%10), n/=10; vector<int> last(10,0); for(int i = 0 ; i <= 9 ; i++) ans[i] = g[nums.size()-1][i]; for(int i = nums.size()-1 ; i >=0 ; i--) { int x = nums[i]; for(int j = i==nums.size()-1 ; j < x ; j++) { for(int k = 0 ; k <= 9 ; k++) ans[k] += last[k] * base[i]; ans[j] += base[i]; for(int k = 0 ; k <= 9 ; k++) ans[k] += f[i][k]; } last[x] ++; if(!i) for(int k = 0 ; k <= 9 ; k++) ans[k] += last[k]; } return ans; } vector<int> ask(unsigned int a, unsigned int b) { auto x = dp(b); auto y = dp(a-1); vector<int> ans; for(int i = 0 ; i <= 9 ; i++) ans.push_back(x[i]-y[i]); return ans; } void print(vector<int> ans) { for(auto x:ans) printf("%lld ",x); printf(" ") ; } signed main() { init(); int a,b; cin >> a >> b ; auto t = ask(a,b); print(t); return 0; } ```
by StkOvflow @ 2022-09-19 13:27:19


@[yczmCO2](/user/576242) 太巨辣!谢谢神犇%%%
by adolf_stalin @ 2022-09-20 08:51:53


@[StkOvflow](/user/576242) 感谢。没开long long错了7个测试点。
by sjyh_jy @ 2024-01-11 16:03:36


|