HDU 5808[数位dp]
/*
题意:
给你l和r,范围9e18,求l到r闭区间有多少个数字满足,连续的奇数的个数都为偶数,连续的偶数的个数都为奇数。
例如33433符合要求,44不符合要求。不能含有前导零。 思路:
队友说是数位dp...我都反映不过来。
知道是数位dp以后,思路就显而易见了。
dp的方法是最后一位的性质,是偶数还是奇数,是连续的第偶数个还是第奇数个。所以一共只有四种状态,而题目中最多19位数字...
用了以上的方法,我们可以轻易解决有n为数字的符合要求的数字的个数。
问题是如何考虑边界条件。
所以我们可以先判断l和r有多少位。然后提前打表,中间的位数直接加到答案上来就好。
现在我们讨论跟l和r位数相同的在l到r范围内的,即大于等于l,小于等于r的个数。
假如l和r位数相同,那么我们可以用小于等于r的减去小于等于l的,然后特判l是不是。
位数不同,可以直接求和l位数相同的,大于等于l的加上和r位数相同的小于等于r的。
所以现在问题转化为,位数确定的情况下,小于等于或者大于等于某个数的符合条件数的个数有多少。
类似dfs,依次讨论前几位大于等于某位或者小于等于某位有多少个...(这个大概是数位dp的核心?)
【简单说一下,第i次统计的数目是,假如第i位大于边界值,而前i-1位等于边界值的符合要求的数字的数目,这样一直统计到i+1...】
*/ #include<bits/stdc++.h>
using namespace std;
bool panduan(unsigned long long num)
{
int curr=;
int len=;
while(num)
{
int temp=num%;
if(curr==)
{
if(temp%)
curr=;
else curr=;
len=;
}
else
{
if(curr==)
{
if(temp%)
len++;
else
{
if(len%)
return false;
len=;
curr=;
}
}
else
{
if(temp%==)
len++;
else
{
if(len%==)
return false;
len=;
curr=;
}
}
}
num/=;
}
if((curr==)&&(len%==))
return true;
if((curr==)&&(len%==))
return true;
return false;
}
int get_wei(unsigned long long t){
int rel=;
while(t>){
rel++;
t/=;
}
return rel;
}
unsigned long long dp[][];
unsigned long long biao[];
void dabiao(){
for(int i=;i<=;i++){
memset(dp,,sizeof(dp));
for(int j=;j<=i;j++){
if(j==){
dp[j][]+=;
dp[j][]+=;
}
dp[j][]+=(dp[j-][]+dp[j-][])*;
dp[j][]+=dp[j-][]*;
dp[j][]+=(dp[j-][]+dp[j-][])*;
dp[j][]+=dp[j-][]*;
}
biao[i]=dp[i][]+dp[i][];
}
}
int fenjie[];
unsigned long long dayudengyu(unsigned long long l){
unsigned long long rel=;
unsigned long long ll=l;
int num=;
while(ll>){
fenjie[num++]=ll%;
ll/=;
}
for(int i=;i<num/;i++){
swap(fenjie[i],fenjie[num-i-]);
}
memset(dp,,sizeof(dp));
for(int i=;i<num;i++){
for(int j=i;j<num;j++){
if(j==i){
if(fenjie[i]&){
if(j==){
dp[j][]=dp[j][]=(-fenjie[i])/;
}
else{
int ttt=(-fenjie[i])/;
dp[j][]=(dp[j-][]+dp[j-][])*ttt;
dp[j][]=dp[j-][]*ttt;
dp[j][]=(dp[j-][]+dp[j-][])*ttt;
dp[j][]=dp[j-][]*ttt;
}
}
else{
if(j==){
dp[j][]=(-fenjie[i])/-;
dp[j][]=(-fenjie[i])/;
}
else{
int ttt=(-fenjie[i])/;
dp[j][]=(dp[j-][]+dp[j-][])*(ttt-);
dp[j][]=dp[j-][]*(ttt-);
dp[j][]=(dp[j-][]+dp[j-][])*ttt;
dp[j][]=dp[j-][]*ttt;
}
}
}
else{
dp[j][]=(dp[j-][]+dp[j-][])*;
dp[j][]=dp[j-][]*;
dp[j][]=(dp[j-][]+dp[j-][])*;
dp[j][]=dp[j-][]*;
}
}
rel+=dp[num-][]+dp[num-][];
memset(dp,,sizeof(dp));
for(int j=;j<=i;j++){
if(j==){
if(fenjie[j]&)dp[j][]=;
else dp[j][]=;
}
else{
if(fenjie[j]&){
dp[j][]=(dp[j-][]+dp[j-][]);
dp[j][]=dp[j-][];
}
else{
dp[j][]=(dp[j-][]+dp[j-][]);
dp[j][]=dp[j-][];
}
}
}
}
return rel+dp[num-][]+dp[num-][];
}
unsigned long long xiaoyudengyu(unsigned long long l){
unsigned long long rel=;
unsigned long long ll=l;
int num=;
while(ll>){
fenjie[num++]=ll%;
ll/=;
}
for(int i=;i<num/;i++){
swap(fenjie[i],fenjie[num-i-]);
}
memset(dp,,sizeof(dp));
for(int i=;i<num;i++){
for(int j=i;j<num;j++){
if(j==i){
if(fenjie[i]&){
if(j==){
dp[j][]=fenjie[i]/;
dp[j][]=fenjie[i]/;
}
else{
unsigned long long ttt=(fenjie[i])/+;
unsigned long long tt=fenjie[i]/;
dp[j][]=(dp[j-][]+dp[j-][])*ttt;
dp[j][]=dp[j-][]*ttt;
dp[j][]=(dp[j-][]+dp[j-][])*tt;
dp[j][]=dp[j-][]*tt;
}
}
else{
if(j==){
dp[j][]=max(fenjie[i]/-,);
dp[j][]=(fenjie[i])/;
}
else{
int ttt=max(,fenjie[i]/);
int tt=fenjie[i]/;
dp[j][]=(dp[j-][]+dp[j-][])*(ttt);
dp[j][]=dp[j-][]*(ttt);
dp[j][]=(dp[j-][]+dp[j-][])*(tt);
dp[j][]=dp[j-][]*tt;
}
}
}
else{
dp[j][]=(dp[j-][]+dp[j-][])*;
dp[j][]=dp[j-][]*;
dp[j][]=(dp[j-][]+dp[j-][])*;
dp[j][]=dp[j-][]*;
}
}
rel+=dp[num-][]+dp[num-][];
//cout << rel << endl;
memset(dp,,sizeof(dp));
for(int j=;j<=i;j++){
if(j==){
if(fenjie[j]&)dp[j][]=;
else dp[j][]=;
}
else{
if(fenjie[j]&){
dp[j][]=(dp[j-][]+dp[j-][]);
dp[j][]=dp[j-][];
}
else{
dp[j][]=(dp[j-][]+dp[j-][]);
dp[j][]=dp[j-][];
}
}
}
}
return rel+dp[num-][]+dp[num-][];
}
int main(){
int a;
dabiao();
int cas=;
scanf("%d",&a); while(a--){
cas++;
unsigned long long l,r,ll,rr;
unsigned long long rel=;
scanf("%llu%llu",&l,&r);
int st=get_wei(l);
int ed=get_wei(r);
for(int i=st+;i<ed;i++){
rel+=biao[i];
}
if(st==ed){
rel+=xiaoyudengyu(r);
rel+=panduan(l);
rel-=xiaoyudengyu(l);
}
else{
rel+=dayudengyu(l);
rel+=xiaoyudengyu(r);
}
printf("Case #%d: ",cas);
printf("%llu\n",rel);
} }
HDU 5808[数位dp]的更多相关文章
- hdu 4507 数位dp(求和,求平方和)
http://acm.hdu.edu.cn/showproblem.php?pid=4507 Problem Description 单身! 依旧单身! 吉哥依旧单身! DS级码农吉哥依旧单身! 所以 ...
- hdu 4352 数位dp + 状态压缩
XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6156 数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6156 题意:如题. 解法:数位DP,暴力枚举进制之后,就转化成了求L,R区间的回文数的个数,这个直接做 ...
- hdu:2089 ( 数位dp入门+模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 数位dp的模板题,统计一个区间内不含62的数字个数和不含4的数字个数,直接拿数位dp的板子敲就行 ...
- HDU 4352 XHXJ's LIS HDU(数位DP)
HDU 4352 XHXJ's LIS HDU 题目大意 给你L到R区间,和一个数字K,然后让你求L到R区间之内满足最长上升子序列长度为K的数字有多少个 solution 简洁明了的题意总是让人无从下 ...
- hdu 3709 数位dp
数位dp,有了进一步的了解,模板也可以优化一下了 题意:找出区间内平衡数的个数,所谓的平衡数,就是以这个数字的某一位为支点,另外两边的数字大小乘以力矩之和相等,即为平衡数例如4139,以3为支点4*2 ...
- HDU 2089 数位dp入门
开始学习数位dp...一道昨天看过代码思想的题今天打了近两个小时..最后还是看了别人的代码找bug...(丢丢) 传说院赛要取消 ? ... 这么菜不出去丢人也好吧~ #include<stdi ...
- HDU 2089 数位dp/字符串处理 两种方法
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU 3652(数位DP)
题目链接:B-number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
随机推荐
- Oracle NoLogging Append 方式减少批量insert的redo_size
业务处理中,很多时候使用实表临时表处理中间结果,而实表的Insert操作缺省会记录redo log,针对此问题收集相关测试总结信息如下: [转] 常见dml.ddl语句使用nologging选项所生成 ...
- 【Reporting Services 报表开发】— 数据表的使用
一.打开 SQL Server Business Intelligence Development Studio,新建项目—>商业智能项目—> 报表服务器项目,命名为CH3 二.在报表文件 ...
- 斐波那契(Fibonacci)数列的几种计算机解法
题目:斐波那契数列,又称黄金分割数列(F(n+1)/F(n)的极限是1:1.618,即黄金分割率),指的是这样一个数列:0.1.1.2.3.5.8.13.21.34.…….在数学上,斐波纳契数列以如下 ...
- mysql 获取一个表中缺失的最小编号
select count(*),t1.`name` from test_id t1INNER JOIN test_id t2on t1.id >= t2.idgroup by t1.id,t1. ...
- Android 网络编程 Socket
1.服务端开发 创建一个Java程序 public class MyServer { // 定义保存所有的Socket,与客户端建立连接得到一个Socket public static List< ...
- 【jmeter】浅说 think time
接口每天被5000个人调用,同时在线500人,每天要被调用50000次. 过了没多久测试完成写了一份报告发给项目经理: 并发 | 响应时间 | 应用服务器cpu |数据库服务器cpu |TPS | ...
- 【linux】输出重定向
“>”:把正确结果输出到一个文件 [root@andon ~]# ls > 1 [root@andon ~]# cat 1 1 anaconda-ks.cfg install.log in ...
- SQLite介绍、学习笔记、性能测试
SQLite介绍.学习笔记.性能测试 哪些人,哪些公司或软件在用SQLite: Nokia's Symbian,Mozilla,Abobe,Google,阿里旺旺,飞信,Chrome,FireFox可 ...
- BeX5学习笔记
1.[窗口]——[首选项]中,有数据源等其它信息的设置,如下所示:
- ARM Linux从Bootloader、kernel到filesystem启动流程
转自:http://www.veryarm.com/1491.html ARM Linux启动流程大致为:bootloader ---->kernel---->root filesyste ...