1042 數字0 9的數量 非數字dp解法

2022-02-18 01:53:35 字數 1703 閱讀 9434

給出一段區間a-b,統計這個區間內0-9出現的次數。

比如 10-19,1出現11次(10,11,12,13,14,15,16,17,18,19,其中11包括2個1),其餘數字各出現1次。

兩個數a,b(1 <= a <= b <= 10^18)

輸出共10行,分別是0-9出現的次數

10 19

1111

1111

111題意很明確,

其實只要能求的到b的就可以.

然後用val(b) - val(a-1)就能得出結果

我的思路是既然要求1到n的,那麼每次我只計算1到n的每個數的最後一位.

並且記錄最後一位的狀態變化.

比如求2018

那麼第一次就是2018/10 = 201 2018%10 = 8

那麼從0到9每個位上就能加201, 然後 1到8都加1

下一次就是201/10 = 20 201%10 = 1

那麼0到9每位加20*10 ,然後從1加9;

仔細看**就知道我的思路是什麼了.

每次都減掉最後一位數.

1 #include 2

#define ll long long int

3using

namespace

std;

4ll a,b;

5 ll an[10], bn[10];6

void

solve(ll x,ll xn)

17 ll bb = x%10;18

for(int i = 1; i < bb; i++)

21 xn[bb] += cnt + 1

;22 cnt = cnt + (x%10 )*ans;

23 ans *= 10

;24 x /= 10;25

}26}27

intmain()

34return0;

35 }

數字dp

1 #include2 #include3 #include4 #include5 #include6

#define ll long long

7using

namespace

std;8//

迴圈兩遍,sumright-sumleft9//

10132

10//

==0:pre*after !=0:cur*pre*對應位數+after

11//

0 + 132 + 10*cur*100+after + 101*cur*100*10+2 +1013*1

12//

19 1*

13 ll ans[10

];14

void solve(ll n,bool

f)15

26//

cout<<" m is "<27

for(int i=0;i<10;i++)

2833 ans[0]-=temp*sign;

34 temp*=10;35

}36}37

//10+1+1

38int

main()

3951

return0;

52 }

1042 數字0 9的數量 數字DP

1042 數字0 9的數量 基準時間限制 1 秒 空間限制 131072 kb 分值 10難度 2級演算法題 給出一段區間a b,統計這個區間內0 9出現的次數。比如 10 19,1出現11次 10,11,12,13,14,15,16,17,18,19,其中11包括2個1 其餘數字各出現1次。inp...

1042 數字0 9的數量 數字dp

給出一段區間a b,統計這個區間內0 9出現的次數。比如 10 19,1出現11次 10,11,12,13,14,15,16,17,18,19,其中11包括2個1 其餘數字各出現1次。首先是最困惑的除零 假設是四位數 多算的字首零的數目 第2位的字首0有10 第三位有100第四位1000個正好可以合...

51nod 1042 數字0 9的數量 數字DP

題目 給出一段區間a b,統計這個區間內0 9出現的次數。比如 10 19,1出現11次 10,11,12,13,14,15,16,17,18,19,其中11包括2個1 其餘數字各出現1次。input 兩個數a,b 1 a b 10 18 output 輸出共10行,分別是0 9出現的次數 這題感覺...