合集-数位DP

摘要:原题链接 题解 abcdefg等价于求 a000000+b00000+c0000+d000+e00+f0+g code #include<bits/stdc++.h> #define ll long long using namespace std; ll ten[14]={0}; ll f[14] 阅读全文
posted @ 2024-03-21 22:50 纯粹的 阅读(33) 评论(0) 推荐(0)
摘要:原题链接 题解 1.abcdef= 1 ~ a* + ab* ~ abc + abc* ~ abcd + ... + abcde * ~ abcedf code #include<bits/stdc++.h> #define ll long long using namespace std; ll 阅读全文
posted @ 2024-03-22 20:55 纯粹的 阅读(45) 评论(0) 推荐(0)
摘要:原题链接 题解 1.异或是01变1,11变0,或是01变1,11变1,所以或的越多(即分的组越多),结果越大 2.我们令x=x+1,这样小于等于x的 问题就变成了小于x 的问题,这里我们采用逼近答案的方法。 3.对于某一位而言,如果有奇数个元素在这一位上是1,那么不管怎么分,最后的结果肯定是1,如果 阅读全文
posted @ 2024-03-27 21:37 纯粹的 阅读(84) 评论(0) 推荐(0)
摘要:原题链接 题解 1.如果数字为 \(100110101\) 那么答案为 \(000000000\) ~ \(011111111\) 中,k个1的组合数 + \(100000000\) ~ \(100011111\) 中k-1个1的组合数 +...+ \(1010101...\) (有k个1) 中0个 阅读全文
posted @ 2024-03-30 18:43 纯粹的 阅读(136) 评论(0) 推荐(0)
摘要:原题链接 题解 由于题目能使 \(a_i⊕x≤k\) 的 \(x\) 没有限制,所以我们反过来求能使其成立的x的范围 对于a,k二进制下的第i位,如果都为1,我们可以令此时的x在这一位也为一,然后i后面的位去什么都可以,然后x=0的时候也可能可以,就看后面有没有小于的 如果a为1,k为0,那么此时x 阅读全文
posted @ 2024-04-04 14:26 纯粹的 阅读(73) 评论(0) 推荐(0)
摘要:原题链接 题解 1.一眼数位dp, 康托是谁?不认识,在每一位确保小于的时候可以任意取 2.阶乘一开始就要放好 3.在遍历到后面几位的时候,可能前面几位用过了比x小的树,所以我们要知道小于x且没被用过的个数,这就是区间查询加单点修改,树状数组比较方便 4.树状数组的空间复杂度比较小,每个点就对应且只 阅读全文
posted @ 2024-04-05 00:48 纯粹的 阅读(54) 评论(0) 推荐(0)
摘要:原题链接 题解 一个细节坑我好久 code #include<bits/stdc++.h> #define ll long long using namespace std; ll f[15][15]={0};//从最高位第i位数字为j时的数字里有多少windy数 ll solve(ll now) 阅读全文
posted @ 2024-04-06 19:58 纯粹的 阅读(35) 评论(0) 推荐(0)
摘要:原题链接 题解 关键因素:\(b_i\) 与 \(b_{i-1}\) 至少有一位都是一 这是我第一份代码 #include<bits/stdc++.h> using namespace std; int a[100005],dp[100005]={0}; int main() { int n; ci 阅读全文
posted @ 2024-05-13 14:59 纯粹的 阅读(23) 评论(0) 推荐(0)
摘要:原题链接 一句话题意 分别找出长度为n,每位数字和恰好为m的最小数和最大数,如果找不到输出”-1 -1“ 思维 怎么确保构造的数最小/大? 怎么确保数字和恰好为m? 实施 遍历每一位,贪心地选取最大/最小的数,直到接下来的数字不足以贪心 细节 1.没有前导零 2.数字和恰好为m 3.注意边界特判 c 阅读全文
posted @ 2024-06-06 16:11 纯粹的 阅读(36) 评论(0) 推荐(0)
摘要:原题链接 题解 1.先想想能不能暴力? 发现好像不行,因为不知道哪些元素组合的按位与能恰好有k个1 2.观察数据范围,发现 \(a_i \leq 63\) 也就是说,按位与的结果最大不会大于63 ,即 6 位 1 ,这暗示着我们可能可以从这里入手,即遍历所有按位与的情况,然后判断每种有k个1的按位与 阅读全文
posted @ 2024-06-13 21:16 纯粹的 阅读(38) 评论(0) 推荐(0)
摘要:原题链接 题解 由于数位很大,所以要朝着数位方向想,对于从左到右数第 \(i\) 位,其贡献为 \([1,i-1]\) 位组成的数字*10 + \(s_i\),等于 \([1,i]\) 区间放到了答案的 \([n-i+1,n]\) code #include<bits/stdc++.h> using 阅读全文
posted @ 2024-07-06 23:30 纯粹的 阅读(46) 评论(0) 推荐(0)
摘要:原题链接 题解 任何数一定可以被二进制表示下最低位的一及以下的二次方数整除 code #include<bits/stdc++.h> #define ll long long #define lowbit(x) ((x)&(-x)) using namespace std; void solve() 阅读全文
posted @ 2024-07-23 09:38 纯粹的 阅读(58) 评论(0) 推荐(0)