定义: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. ASP.NET WebAPI 14 仿写Filter管道

    WebAPI中有设计了几种管道(Channel),大概如下:HttpMessageHandler,ActionFilter管道,ExceptionFilter管道.在三种管道中HttpMessageH ...

  2. ANSI X9.19 MAC算法

    /// <summary> /// 获取MAC校验字节数据 /// </summary> /// <param name="bankData"> ...

  3. 硅谷新闻2--禁止viewpager预加载

    ContentFragment.java class MyOnPageChangeListener implements ViewPager.OnPageChangeListener { ..... ...

  4. 细说Mysql四种安装方法及自动化部署

    一.简介 数据库(Database)是按照数据结构来组织.存储和管理数据的仓库, 每个数据库都有一个或多个不同的API用于创建,访问,管理,搜索和复制所保存的数据. 我们也可以将数据存储在文件中,但是 ...

  5. SharpGL学习笔记(十四) 材质:十二个材质球

    材质颜色 OpenGL用材料对光的红.绿.蓝三原色的反射率来近似定义材料的颜色.象光源一样,材料颜色也分成环境.漫反射和镜面反射成分,它们决定了材料对环境光.漫反射光和镜面反射光的反射程度.在进行光照 ...

  6. Bootstrap 我的学习记录3 导航条理解

    以下理论内容copy自Bootstrap中文网 (一个不错的bootstrap学习网站) 导航条 默认样式的导航条 导航条是在您的应用或网站中作为导航页头的响应式基础组件.它们在移动设备上可以折叠(并 ...

  7. EntityFramework4.1开发

    常见问题大概为这几个 一.ef4.1 codeFirst 修改表结构 增加字段等 EF code first需要重新生成库导致数据丢失的问题. 二.ef4.1 没有了edmx等复杂的东西 变得简单 干 ...

  8. android 内存泄露调试

    一.概述 1 二.Android(Java)中常见的容易引起内存泄漏的不良代码 1 (一) 查询数据库没有关闭游标 2 (二) 构造Adapter时,没有使用缓存的 convertView 3 (三) ...

  9. iOS加载程序视图的方式

    The UIViewController class provides built-in support for loading a view controller's views whenever ...

  10. iOS扫一扫功能开发

    之前很多二维码扫描都是基于zxing做的,但是zxing用起来真的很麻烦,又一直不更新.随着iOS6退出历史舞台,终于可以使用iOS7以后,用系统的AVFoundation做的二维码扫描器了. 初始化 ...