傳送門
題目描述:
農民約翰的牛正開始乙個美妙的旅程。牛車的里程表上顯示乙個整數表示里程,旅程開始時里程數為 x
(100≤x
≤1018
)x(100 \le x \le 10^)
x(100≤
x≤10
18),結束時里程數為 y(x
≤y≤1
018
)y(x \le y \le 10^)
y(x≤y≤
1018
)。每當里程表顯示乙個有趣的數時(包括起點和終點數),牛們會發出愉快的叫聲。
對於乙個里程數的每一位,如果有至少一半的數字時相同的,則這個里程數乙個有趣的數。例如:3223
3223
3223
和 110
11011
0 是有趣的數,而 97791
97791
9779
1 和 123
12312
3 則不是。
請計算,整個旅程中,牛們會發出多少吃愉快的叫聲。
輸入格式:
一行兩個數,分別表示 x,y
x,yx,
y。輸出格式:
一行乙個數,表示答案。
樣例資料:輸入
110 133 輸出
14 看到題目就知道這是一道數字d
p\mathrm
dp的題。那在 d
p\mathrm
dp的時候,怎麼來計算有沒有某乙個數字有沒有超過一半呢?(這也是考場上一直困擾我的問題。)
我們可以列舉每個數(0
00 ~ 9
99),就讓這個數超過一半(將這個數設為 x
xx)。
這樣,問題就轉化成了,計算 [l,
r]
[\;l,r\;]
[l,r
] 中,各個位上 x
xx 超過一半的數的個數,這就是一道簡單題了。
然後把 0
00 ~ 9
99 中的答案累加一下就好了。
然後注意兩點:
對於 1919
1919
1919
這樣的數,列舉 1
11 的時候會算一次,列舉 9
99 的時候會再算一次,就會算重,要減去重複的。
注意要除去前導零的影響。
#include
#include
#include
#define ll long long
using
namespace std;
int a[20]
,a,b;
ll f[20]
[20][
20][2
][2]
;ll dp1
(int p,
int num,
int all,
bool lead,
bool limit)
f[p]
[num]
[all]
[lead]
[limit]
=ans;
return ans;
}ll g[20]
[20][
20][20
][2]
[2];
ll dp2
(int p,
int num1,
int num2,
int all,
bool lead,
bool limit)if(
~g[p]
[num1]
[num2]
[all]
[lead]
[limit]
)return g[p]
[num1]
[num2]
[all]
[lead]
[limit]
;int i,up=limit?a[p]:9
;ll ans=0;
for(i=
0;i<=up;
++i)
g[p]
[num1]
[num2]
[all]
[lead]
[limit]
=ans;
return ans;
}ll solve
(ll x)
for(i=
0;i<=9;
++i)
}return ans;
}int
main()
2018 11 05測試T3 相交
傳送門 一道不錯的題 首先,要知道乙個東西,即若兩條路徑相交,則一條路徑的 lca lcalc a 必然在另一條路徑上 我們每加入一條邊,都計算一下之前的邊加上它對答案的貢獻 現在假設加 a,b a,b a,b 條邊,具體有一下幾種情況 統計 a,b a,b a,b 這條路徑上的 lca lcalc...
2019 03 02測試T3 層流
傳送門 題目描述 對於乙個全集 u uu,對於他的兩個子集 a,b a,ba,b,如果 a b a subset b a b 或 b a b ab a 或 a b a b varnothing a b 則這兩個集合就是 u uu 的層流集。現在小 z 想把這個問題搬到樹上來。他給出 n nn 個頂點...
T3進銷存公升級T 備忘
t3進銷存資料公升級t 只能公升級各種基礎檔案和截至某月底的結存數量 不含單價 金額 一 安裝及加密識別 1.1 因為不能公升級歷史業務單據,所以如果要查詢t3的歷史資料,需要在訂購t 時同時訂購t3查詢工具。1.2 t3和t 需要安裝在一台電腦,t3主要查詢,不再做新資料,所以想用高版本sql,也...