定义:cnt[L][K]表示长度为L,最高位为K的满足条件C的个数。

首先预处理出cnt数组,枚举当前长度最高位和小一个长度的最高位,如果相差大于2则前一个加上后一个的方法数。

然后给定n,计算[1,n-1]中满足条件C的数的个数。

设有K位数,则不足K位的累加,然后枚举K位数的情况,从高位到低位枚举,每次枚举到比该位小1的数,注意:如果某时刻该数中有两位相差大于2,则再枚举下去已经没有意义,因为以后的数再也不会满足条件C,这时退出即可。

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
#define Mod 1000000007
#define ll long long
using namespace std;
#define N 100007 ll cnt[][]; //cnt[L][K]:长度为L,最高位为K的满足条件C的数的个数
ll NUM[]; ll DP(ll a) //[1,n-1]
{
int i,j,K;
int pre,head;
ll res = ;
K = ;
while(K <= && NUM[K] <= a)
K++;
K--;
//cout<<"K is "<<K<<endl;
for(i=;i<K;i++) //所有小于a长度的长度
for(j=;j<=;j++) //所有首位
res += cnt[i][j];
head = a/NUM[K]; //数a的首位
for(i=;i<head;i++) //从1开始(不含前导0)
res += cnt[K][i];
a %= NUM[K]; //去除首位
pre = head; //多一位的首位
for(i=K-;i>=;i--) //长度逐次递减,高位到低位
{
head = a/NUM[i];
for(j=;j<head;j++) //小于a的当前位的数做首位
if(abs(pre-j) >= )
res += cnt[i][j];
if(abs(head-pre) < ) //如果前面某两位出现差小于2,再枚举后面的数就没意义了,因为无论如何都不会满足了。
break;
pre = head;
a %= NUM[i]; //一个一个去除
}
return res;
} int main()
{
int i,j,l,k;
ll a,b;
j = ;
NUM[j++] = 0LL;
for(i=;i<=;i++)
NUM[j++] = (ll)pow(,i-);
//for(i=0;i<j;i++)
//cout<<NUM[i]<<" ";
//cout<<endl;
memset(cnt,,sizeof(cnt));
for(k=;k<=;k++)
cnt[][k] = ;
for(l=;l<=;l++)
{
for(i=;i<=;i++) //长度为l时的首位
{
for(k=;k<=;k++) //长度为l-1时的首位
{
if(abs(k-i) >= )
cnt[l][i] += cnt[l-][k];
}
}
}
for(k=;k<=;k++) //10^18
if(abs(-k) >= )
cnt[][] += cnt[][k]; while(scanf("%lld%lld",&a,&b)!=EOF)
{
printf("%lld\n",DP(b+)-DP(a));
}
return ;
}

UESTC 884 方老师的专题讲座 --数位DP的更多相关文章

  1. UESTC 885 方老师买表 --状压DP

    将方格的摆放分成两种: 1.水平摆放:此时所占的两个格子都记为1. 2.竖直摆放:此时底下那个格子记为1,上面那个记为0. 这样的话,每行都会有一个状态表示. 定义:dp[i][s]表示考虑已经填到第 ...

  2. UESTC 886 方老师金币堆 --合并石子DP

    环状合并石子问题. 环状无非是第n个要和第1个相邻.可以复制该行石子到原来那行的右边即可达到目的. 定义:dp[i][j]代表从第i堆合并至第j堆所要消耗的最小体力. 转移方程:dp[i][j]=mi ...

  3. UESTC 898 方老师和缘分 --二分图匹配+强连通分量

    这题原来以为是某种匹配问题,后来好像说是强连通的问题. 做法:建图,每个方老师和它想要的缘分之间连一条有向边,然后,在给出的初始匹配中反向建边,即如果第i个方老师现在找到的是缘分u,则建边u-> ...

  4. UESTC - 900 方老师炸弹 —— 割点

    题目链接:https://vjudge.net/problem/UESTC-900   方老师炸弹 Time Limit: 4000/2000MS (Java/Others)     Memory L ...

  5. 【专题】数位DP

    [资料] ★记忆化搜索:数位dp总结 之 从入门到模板 by wust_wenhao 论文:浅谈数位类统计问题 数位计数问题解法研究 [记忆化搜索] 数位:数字从低位到高位依次为0~len-1. 高位 ...

  6. UESTC 883 方老师与两个串 --二分搜索+DP

    CF原题 由题可知,n,m太大,无法开出dp[n][m]的数组. 观察发现s/e最大为300,也就是说,选用第一种操作的次数不会超过300. 于是定义dp[i][j],第一个串的前i个数,使用了j次第 ...

  7. UESTC 899 方老师和农场 --双连通分量的构造

    首先将原图中的连通分量缩点,一定可以将原图缩成一棵树的形式,然后统计这棵树的叶子节点个数,答案就是(leaf+1)/2.这里不再证明,可以画个图看一下. (简单说明一下,首先把两个最近公共祖先最远的两 ...

  8. UESTC 900 方老师炸弹 --Tarjan求割点及删点后连通分量数

    Tarjan算法. 1.若u为根,且度大于1,则为割点 2.若u不为根,如果low[v]>=dfn[u],则u为割点(出现重边时可能导致等号,要判重边) 3.若low[v]>dfn[u], ...

  9. UESTC 901 方老师抢银行 --Tarjan求强连通分量

    思路:如果出现了一个强连通分量,那么走到这个点时一定会在强连通分量里的点全部走一遍,这样才能更大.所以我们首先用Tarjan跑一遍求出所有强连通分量,然后将强连通分量缩成点(用到栈)然后就变成了一个D ...

随机推荐

  1. NYOJ:题目529 flip

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=529 由于此题槽点太多,所以没忍住...吐槽Time: 看到这题通过率出奇的高然后愉快的进 ...

  2. [moka同学笔记]一、Yii2.0课程笔记(魏曦老师教程)

    第一节   第二节             课程内容     

  3. HTML <map> 标签-创建带有可点击区域的图像映射

    定义和用法 定义一个客户端图像映射.图像映射(image-map)指带有可点击区域的一幅图像. 所有主流浏览器都支持 <map> 标签. 注释:area 元素永远嵌套在 map 元素内部. ...

  4. andriod RadioButton

    <?xml version="1.0" encoding="UTF-8"?> <LinearLayout android:orientatio ...

  5. VCenter克隆虚拟机报错msg.snapshot.error-QUIESCINGERROR

    参考文献: http://www.mrtechjunkie.com/error-occurred-taking-snapshot-msg-snapshot-error-quiescingerror/ ...

  6. iOS 新窗口在最上层

    有的时候需要弹出一个UIView 在整个视图的最上方,使用 [self.view addsubview : view] 一般就可以了,但是这样不严谨,因为这是一个tableview,那么这个view ...

  7. java多线程系列7-停止线程

    本文主要总结在java中停止线程的方法 在java中有以下三种方法可以终止正在运行的线程: 1.使用退出标志 2.使用stop方法强行终止线程,但是不推荐,因为stop和suspend.resume一 ...

  8. mac 下安装android studio(转)

    1)下载最新jdk8,下载android studio 2)安装jdk8,双击jdk8的安装包,将jdk8的安装包拖到Application,可能会出现这种问题:要求Mac OS X10.7.3或更高 ...

  9. Java从零开始学四十六(Junit)

    一.软件测试 软件开发: 项目调研--需求分析--软件设计--程序编码--软件测试--运行维护 软件测试:利用测试工具按照测试方案和流程对产品进行功能和性能测试,使用人工或者自动手段来运行或测试某个系 ...

  10. OC--代理模式

    一,代理设计模式的场合: 当对象A发生了一些行为,想告知对象B (让对象B成为对象A的代理对象) 对象B想监听对象A的一些行为 (让对象B成为对象A的代理对象) 当对象A无法处理某些行为的时候,想让对 ...