1. 程式人生 > >CodeForces - 1073E :Segment Sum (數位DP)

CodeForces - 1073E :Segment Sum (數位DP)

You are given two integers

">998244353 998244353 .

For example, if

Input

The only line of the input contains three integers

l">l ,

Output

Print one integer — the sum of numbers from

r">r such that each number contains at most

Examples Input
10 50 2
Output
1230
Input
1 2345 10
Output
2750685
Input
101 154 2
Output
2189

題意:求區間[L,R]的滿足digit種類不超過K的數字之和。

思路:與常規我數位DP不一樣的是,這裡求是不是個數,而是這些書之和。所以我們要記錄一個二元組(x,y)分別表示(子樹之和,子樹葉子個數)。

(數位DP其實就是一棵樹,子樹相同的時候可以直接呼叫答案)

那麼當前節點為根的樹的資訊=(所有子樹的和+當前位*葉子個數,所有葉子個數之和)。

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define ll long long
#define pii pair<int,int>
#define mp make_pair
using namespace std;
const int Mod=998244353;
pii dp[20][1<<10],O=mp(0,0);
int v[20],num[1<<10],K,q[20],tot;
pii dfs(int pos,int st,int lim)
{
    if(!lim&&dp[pos][st]!=O) return dp[pos][st];
    if(pos==1) return mp(0,1);
    int up=9; pii res=O,tmp; if(lim) up=q[pos-1];
    rep(i,0,up){
        if(num[st|(1<<i)]<=K){
            tmp=dfs(pos-1,st|(1<<i),lim&&i==up);
            (res.second+=tmp.second)%=Mod; 
            (res.first+=tmp.first)%=Mod;
            (res.first+=(ll)v[pos-1]*i%Mod*tmp.second%Mod)%=Mod;
        }
    }
    return dp[pos][st]=res;
}
int cal(ll x)
{
    if(x==0) return 0;
    tot=0; int ans=0;
    while(x) q[++tot]=x%10,x/=10;
    memset(dp,0,sizeof(dp));
    rep(i,1,tot){
        ll up=9; if(i==tot) up=q[tot];
        rep(j,1,up){
            pii tmp=dfs(i,1<<j,(i==tot)&&(j==q[tot]));
            (ans+=(ll)v[i]*j%Mod*tmp.second%Mod)%=Mod;
            (ans+=tmp.first)%=Mod;
        }
    }
    return ans;
}
int main()
{
    rep(i,1,1<<10) num[i]=num[i>>1]+(i&1);
    v[1]=1; rep(i,2,18) v[i]=(ll)v[i-1]*10%Mod;
    ll L,R; scanf("%lld%lld%d",&L,&R,&K);
    printf("%d\n",((cal(R)-cal(L-1))%Mod+Mod)%Mod);
    return 0;
}

 

相關推薦

CodeForces - 1073E Segment Sum 數位DP

You are given two integers l l and r r (l≤r l≤r ). Your task is to calculate the sum of numbers from l l to r r (including l&nb

E. Segment Sum 數位dpEducational Codeforces Round 53 (Rated for Div. 2)

題目連結:http://codeforces.com/contest/1073/problem/E 參考連結:https://blog.csdn.net/qq_38677814/article/details/83415782 題意:給出l,r,k,在範圍 [ l , r ] 內找出數字

codeforces 1073 E. Segment Sum數位dp統計和

題目連結:http://codeforces.com/problemset/problem/1073/E 思路:數位dp按位求貢獻算和 #include <cstdio> #include <cstdlib> #include <cstring> #i

ZOJ 3962 Seven Segment Display數位DP題解

題意:給一個16進位制8位數,給定每個數字的貢獻,問你貢獻和。 思路:數位DP,想了很久用什麼表示狀態,看題解說用和就行,其他的都算是比較正常的數位DP。 程式碼: #include<iostream> #include<stdio.h> #include<cmath

哈爾濱理工大學第七屆程式設計競賽決賽網路賽-高年級組-D數圈圈數位DP

時間限制:C/C++ 1秒,其他語言2秒空間限制:C/C++ 32768K,其他語言65536K64bit IO Format: %lld 題目描述 tabris有一個習慣,無聊的時候就會

Codeforces1073E Segment Sum數位DP

題目分析: 裸的數位DP,注意細節。 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 const int mod = 998244353; 5 int k; 6 7 int dp[25][1024],sz[25]

LightOJ - 1205Palindromic Numbers 數位DP&迴文串

A palindromic number or numeral palindrome is a 'symmetrical' number like 16461 that remains the same when its digits are reversed. In this problem you

Gym 100418J Lucky tickets數位dp

space mat comm sizeof ++ memset 狀態 out rac 題意:給定一個n。求區間[1, n]之間的全部的a的個數。a滿足: a能整除 把a表示自身二進制以後1的個數 思路:題意非常繞.... 數位dp,對於全部可能的1的個數我們

HDU2089 ------不要62數位dp

判斷 tom name pop iostream blank 位置 play show 不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others

HDU 2089 不要62數位DP

註意 break 大小 printf bre 表示 += 理解 ini 題意:求[n,m]內所有數字中不出現4也不出現連續62的數的個數。 輸入:n m,多組數據,以0 0結尾。 輸出:符合條件的數的個數。 限制:(0<n≤m<1000000) 時間:1000

[HDOJ6148] Valley Numer數位dp

div max col for ring namespace pri second strlen 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6148 經典數位dp,dp(l,pre,status)表示長度l,之前數字是pr

HDU 6148 Valley Numer數位DP

ima for oca ace end string map type http 1 #include <iostream> 2 #include <queue> 3 #include <stack> 4 #incl

HDU 5787 K-wolf Number數位dp

blog typedef turn pan con target ack cnblogs freopen http://acm.split.hdu.edu.cn/showproblem.php?pid=5787 題意:給出一個範圍[l,r]和整數k,求出在該範圍的數在十進

sgu258AlmostLuckyNumbers數位dp

.com get dpx 數位 id3 cst ets number p s 4Zt爬慚史6縣季韻http://www.docin.com/amchx2108 3x構ffZ9囤巒誄悄40http://t.docin.com/sina_6273011242 x67emcs仿

51nod 1623 完美消除數位DP

eof div ... 狀態 class esp bool turn gpo   首先考慮一下給一個數如何求它需要多少次操作。   顯然用一個單調棧就可以完成:塞入棧中,將比它大的所有數都彈出,如果棧中沒有當前數,答案+1。   因為數的範圍只有0~9,所以我們可以用一

【Hdu3555】 Bomb數位DP

-- return cstring long long 表示 getchar() bom math while Description 題意就是找0到N有多少個數中含有49。 \(1\leq N \leq2^{63}-1\) Solution 數位DP,與hdu3652類似

CF D. Beautiful numbers 數位dp

推斷 force __int64 mes res com snippet csdn display http://codeforces.com/problemse

HDU 4249 A Famous Equation數位DP

data else if 代碼量 pro const sta clu ++ 鏈接 題目鏈接:點擊打開鏈接 思路:用d[i][a][b][c][is]表示當前到了第i

HDU - 2089 不要62數位DP

include scrip panel ans using 交通 += init 遇到 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 題目: Problem Description 杭州人稱那些傻乎乎粘嗒嗒的人