題意
輸入l r k,輸出區間[l,r]內數字種數不超過k的數字之和,比如l=10,r=50,k=1,答案就是11+22+33+44=110
1<=l<=1e18,1<=e<=1e18,1<=k<=9
思路比較明顯的數字dp,因為要考慮當前所用的數字種類所以要把用過的數字狀壓一下,用dp[i][s]表示從低到高遞推到第i位,所用的數字集合為s時的數字個數,數字之和另外開乙個陣列dp2[i][s]進行記錄,計算數字之和的時候只要用數字個數乘上當前選擇的數字再乘上相應的10的冪次就可以了,注意取模,尤其是最後solve(r)-solve(l-1)的減法取模
#include using namespace std;
typedef long long ll;
const int mod = 998244353;
int k;
ll a[20], dp[20][1500], dp2[20][1500], res[20][1500];
ll dfs(int pos, int state, int limit, int lead)
if (!limit && !lead && dp[pos][state] != -1)
ll ans = 0;
int down = 0, up = limit ? a[pos] : 9;
if (lead)
else
for (int i = down; i <= up; i++)
}if (!limit && !lead)
return ans;
}ll solve(ll x)
memset(dp, -1, sizeof(dp));
memset(dp2, 0, sizeof(dp2));
memset(res, 0, sizeof(res));
ll ans = 0;
for (int i = 1; i < (1<<10); i++)
}return ans;
}int main()
Codeforces 976E 題解報告
1 當把所有的倍數2 a都加到同一health上,health增加的最多 2 先計算每乙個creature的hp dmg,按該值對所有的creature排序 再求和,i include using namespace std const int n 200 1000 9 int hp n dmg n...
codeforces 1030E 暴力 思維)
題目 題意 給定一些數,可將區間 l r 中某些數的二進位制位的1的位置更換,使得最終區間所有數異或和為0,求這樣的區間個數。思路 在那裡瞎dp了好久,wa的很徹底,借鑑了一下別人的思路。區間合法的條件是 這個區間1的個數為偶數,並且區間中二進位制位1最多的乙個數的二進位制個數小於等於和的一半。我們...
Codeforces 1270E 構造 數學
有 n 個二維平面上的點,每兩個點之間連一條線段,將這些點劃分為兩個非空的集合 a b 同乙個集合內的兩點之間線段用黃色標註,不同集合的兩點之間線段用藍色標註,使距離相同的線段顏色相同。先將所有點的座標以其中乙個點作為原點轉化一下,使其中必定有乙個點是 0,0 然後將所有點按奇偶分為四組 0代表偶數...