定义: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. [moka同学笔记]yii2 activeForm 表单样式的修改

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAv4AAANcCAIAAACopDy/AAAgAElEQVR4nOzdfXAb52H4ef1veSatRV

  2. jquery fadeOut 异步

    1. 概述 jquery实现动画效果的函数使用起来很方便,不过动画执行是异步的, 所以要把自定义的操作放在回调函数里. 2. example <html> <body> < ...

  3. mysql创建数据库指定编码

    GBK: create database test2 DEFAULT CHARACTER SET gbk COLLATE gbk_chinese_ci; UTF8: CREATE DATABASE ` ...

  4. AngularJs Cookie 的使用

    最新在学习 AngularJs ,发现网上很难搜到 AngularJs.Cookie 教程, 就自己写篇博客,希望能帮到刚学的人. 废话不多说上代码 首先要引用 angular-cookies.js ...

  5. Follow me to learn how to use mvc template

    Introduction After having gone through many project: Project A Project B Project C I start to write ...

  6. [js开源组件开发]js文本框计数组件

    js文本框计数组件 先上效果图: 样式可以自行调整 ,它的功能提供文本框的实时计数,并作出对应的操作,比如现在超出了,点击下面的按钮后,文本框会闪动两下,阻止提交.具体例子可以点击demo:http: ...

  7. IOS6学习笔记(三)

    1.ARC空声明变量 使用ARC的另一个优势是所有未初始化的变量默认都是“空值化”的.这意味着像下面这样的声明使用ARC编译后指向的是空值(nil): NSObject *myObject1,*myO ...

  8. CSS3中的calc()

    什么是calc()? calc是英文单词calculate(计算)的缩写,是css3的一个新增的功能; MDN的解释为可以用在任何长度,数值,时间,角度,频率等处; /* property: calc ...

  9. ASP.NET页面动态添加js脚本

    有时我们需要生成自己的JavaScript代码并在运行时动态添加到页面,接下来我们来看一下如何将生成的JavaScript代码动态添加到ASP.NET页面. 为了添加脚本,要将自定义的脚本在一个字符串 ...

  10. centOS 安装 svnserve

    安装说明 系统环境:CentOS-6.3安装方式:yum install (源码安装容易产生版本兼容的问题)安装软件:系统自动下载SVN软件 检查已安装版本 ? 1 2 3 4 5 6 7 8 9 1 ...