题目链接
Codeforces Round #580 (Div. 2)
A
思路
直接暴力查询或者直接输出两个最大的即可
代码实现
1 |
|
你最愿意做的哪件事,才是你的天赋所在
Codeforces Round #580 (Div. 2)
直接暴力查询或者直接输出两个最大的即可
1 | #include<bits/stdc++.h> |
观察到S(n)=S(n-2)S(n-3)S(n-2),按照位置和长度进行搜索,因为只有1e12长度,先前缀处理出这个长度,就可以搜索了。
1 | #include<bits/stdc++.h> |
给出三个数字A,B,C。要你从1-A中取一个x,从1-B中取一个y。找出共有多少对(x,y)满足以下至少一个条件
1.x&y>c;
2.x^y<c;
比赛的时候以为是数论知识,看了题解发现是数位DP,把A,B都转化为二进制,然后用二维的数位DP写。
dp[pos][and][xor][limit1][limit2]表示第pos位的数上 取和 以及取 异或 的情况。
Note:任何二进制的数位DP,都不能忽略前缀0,所以在统计完答案后,需要减去由于前缀0而产生的贡献。
所以还需要添加二维变成dp[pos][and][xor][limit1][limit2][zero1][zero2];
也可以用数学方法推出来多余的数。实际上应该等于ans=min(a,c-1)+min(b,c-1)+1(不会证明);
实际上就是求二叉树的最短遍历,输出路径
采用递归的方式,先不停的深入下去,找到点后就输出,在递归的过程中输出即可。
1 | #include<iostream> |
求l-r之间满足有13并且能够整除13的数。
dp[pos][mod][is13]表示第i位上,余数为mod,is13是是否满足拥有13.
is13有三种情况。
1.当前没有1
2.当前有1
3.当前有13
然后数位DP的板子套一下就好了
1 | #include<bits/stdc++.h> |