首页 > 其他 > 详细

【CF908G】New Year and Original Order

时间:2019-01-05 19:19:52      阅读:166      评论:0      收藏:0      [点我收藏+]

【CF908G】New Year and Original Order

题面

洛谷

题解

\(f[i][j][k][l]\)表示当前在第\(i\)位有\(j\)位大于等于\(k\),当前有没有卡上界的方案数
则枚举新加的数\(p\),有
\[ f[i+1][j+(p\geq k)][k][l|(p<a_i)]=\sum f[i][j][k][l] \]
我们最后统计答案的时候枚举\(k\)

\[ ans=\underbrace{111...11}_{j个1}*(f[i][j][k][0]+f[i][j][k][1]) \]
为什么要乘那么多\(1\)呢?(下面是张图片)
技术分享图片
代码(压行有点丑)

#include <iostream> 
#include <cstdio> 
#include <cstdlib> 
#include <cstring> 
#include <cmath> 
#include <algorithm> 
using namespace std; 
#define rep(i, from, to) for(int i = (from); i <= (to); i++) 
const int Mod = 1e9 + 7; 
const int MAX_N = 1005; 
void pls(int &x, int y) { x += y; if (x >= Mod) x -= Mod; } 
char ch[MAX_N]; int a[MAX_N], N; 
int ans, f[MAX_N][MAX_N][10][2]; 
int main () { 
    scanf("%s", ch + 1); N = strlen(ch + 1); 
    rep(i, 1, N) a[i] = ch[i] - '0'; 
    rep(i, 0, 9) f[0][0][i][0] = 1; 
    rep(i, 0, N - 1) rep(j, 0, i) rep(k, 1, 9) rep(l, 0, 1) rep(p, 0, (l ? 9 : a[i + 1])) 
        pls(f[i + 1][j + (p >= k)][k][l | (p < a[i + 1])], f[i][j][k][l]); 
    rep(k, 1, 9) { 
        int res = 1; 
        rep(i, 1, N) pls(ans, 1ll * res * (f[N][i][k][0] + f[N][i][k][1]) % Mod), res = (10ll * res + 1) % Mod; 
    } 
    printf("%d\n", ans); 
    return 0; 
} 

【CF908G】New Year and Original Order

原文:https://www.cnblogs.com/heyujun/p/10225419.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!