CF1073E Segment Sum [容斥/数位DP]

Author Avatar
空気浮遊 2018年10月31日
  • 在其它设备中阅读本文章
  • 数位dp
  • 容斥
  • 分享到 Facebook
  • 分享到 Telegram
  • 分享到 Twitter
  • 分享到微博

Problem

https://www.luogu.org/problemnew/show/CF1073E

Solution

枚举出现的数的状态,进行数位 dp,则得到的数属于状态的子集。

再做一下容斥即可。

注意由于是要求数的和,因此和和方案数都要记录在 dp 里。

以及注意前导 0 不受约束。

Code

#include<bits/stdc++.h>
#define CLR(x, y) memset(x, y, sizeof(x))
#define BCNT(x) __builtin_popcount(x)
#define MOD (998244353ll)
typedef long long ll;
using namespace std;

template<typename T> inline void gn (T &x) {
    char ch=getchar(), pl=0; x=0;
    while(ch<'0' || ch>'9') {
        if(ch==-1) exit(0);
        pl=ch=='-', ch=getchar();
    }
    while(ch>='0' && ch<='9') x=x*10+ch-'0', ch=getchar(); x*=pl?-1:1;
}

const int N=20, G=1<<10;
int a[N], k;
struct tmp { ll a, b; } f[N][G];
char vis[N][G];
int p[N];
int g[G];

tmp dfs(int x, int g, int lim, int pre) {
    if(x==-1) return {0, 1};
    if(!lim && !pre && vis[x][g]) return f[x][g];
    int maxn=lim?a[x]:9;
    tmp ret={0, 0}, na;
    for(int i=0;i<=maxn;i++) if((g&(1<<i)) || (!i && pre)) {
        na=dfs(x-1, g, lim && i==maxn, pre && !i);
        ret.a+=na.a+na.b*p[x]%MOD*i%MOD, ret.a%=MOD;
        ret.b+=na.b, ret.b%=MOD;
    }
    if(!lim && !pre) vis[x][g]=1, f[x][g]=ret;
    return ret;
}

int solve(ll x) {
    CLR(vis, 0);
    int t=0;
    while(x) a[t++]=x%10, x/=10;
    int ret=0;
    for(int i=1;i<G;i++) {
        g[i]=dfs(t-1, i, 1, 1).a;
        for(int j=(i-1)&i;j;j=(j-1)&i) g[i]=(g[i]-g[j]+MOD)%MOD;
        if(BCNT(i)<=k)
            ret=(ret+g[i])%MOD;
    }
    return ret;
}

ll l, r;
int main() {
    p[0]=1;
    for(int i=1;i<N;i++) p[i]=1ll*10*p[i-1]%MOD;
    gn(l), gn(r), gn(k);
    printf("%d\n", (solve(r)-solve(l-1)+MOD)%MOD);
    return 0;
}

本文链接:https://pst.iorinn.moe/archives/sol-cf-1073e.html
许可: https://pst.iorinn.moe/license.html
若无特别说明,博客内的文章默认将采用 CC BY 4.0 许可协议 进行许可☆

      新篇
旧篇      
    • fingerprint Login
  • home 主页
  • inbox 归档
    • June 2026 1
    • December 2024 1
    • August 2024 1
    • June 2024 1
    • April 2024 3
    • March 2024 1
    • February 2024 2
    • January 2024 1
    • November 2023 1
    • August 2023 1
    • May 2023 1
    • February 2023 2
    • January 2023 2
    • July 2022 1
    • June 2022 1
    • April 2022 1
    • March 2022 1
    • February 2022 2
    • December 2021 1
    • November 2021 1
    • August 2021 3
    • July 2021 3
    • April 2021 2
    • March 2021 1
    • February 2021 4
    • January 2021 2
    • December 2020 1
    • November 2020 1
    • October 2020 3
    • September 2020 1
    • August 2020 1
    • July 2020 1
    • March 2020 1
    • December 2019 1
    • September 2019 1
    • July 2019 1
    • April 2019 2
    • March 2019 13
    • February 2019 15
    • January 2019 11
    • December 2018 3
    • November 2018 6
    • October 2018 28
    • September 2018 31
    • August 2018 18
    • July 2018 13
    • June 2018 27
    • May 2018 11
    • April 2018 12
    • March 2018 19
    • February 2018 8
    • January 2018 7
    • December 2017 2
    • November 2017 2
  • apps 分类
    • 笔记
    • 题解
    • 杂文
    • 技术
    • 游戏
    • 小说
  • 留言板
  • 关于
  • 友链
  • 文章总数 281
主题 - Material i
expand_less
Copyright © 2026 雪屋
Float in air.
Powered by Typecho
Theme - Material