#include <bits/stdc++.h>
typedef long long LL;

const int MOD = (int)1e9 + 7;
LL L,R,G,T;
int dp[62 + 1][2][2][2][2];
bool vis[62 + 1][2][2][2][2];

inline void add(int &a,int b) {
    a += b;
    if (a >= MOD) a -= MOD;
    if (a < 0) a += MOD;
}

int calc(int at,bool al,bool ar,bool bl,bool br) {
    if (at == -1) {
        return 1;
    }
    if (vis[at][al][ar][bl][br]) {
        return dp[at][al][ar][bl][br];
    }

    vis[at][al][ar][bl][br] = true;
    int &ret = dp[at][al][ar][bl][br];
    ret = 0;

    int l = L >> at & 1,
        r = R >> at & 1,
        x = (G ^ T) >> at & 1;
    for (int a = 0; a < 2; ++ a) {
        if (al && a < l) continue;
        if (ar && a > r) continue;
        int b = x ^ a;
        if (bl && b < l) continue;
        if (br && b > r) continue;
        add(ret,calc(at - 1,al && a == l,ar && a == r,bl && b == l,br && b == r));
    }
    return ret;
}

int work() {
    if ((G ^ T) == 0) return (R - L + 1) % MOD;
    memset(vis,false,sizeof(vis));
    return ((R - L + 1) * 2 % MOD - calc(62,true,true,true,true) + MOD) % MOD;
}

int main() {
    int cas;
    scanf("%d",&cas);
    while (cas--) {
        scanf("%I64d%I64d%I64d%I64d",&L,&R,&G,&T);
        printf("%d\n",work());
    }
}
GTW likes czf从前,有两个人名叫GTW,DSY。一天,他们为了争夺DSY的妹子CZF,决定进行一次决斗。首先,CZF会给出一个区间l,l+1,l+2......rl,l+1,l+2......r,和两个数G,T。现在,CZF会在G,T两个数中随机一个数XX,在区间l,rl,r中随机一个数Y,进行一种特殊的运算@。CZF想要快速知道有多少数字可能会是答案。
然而GTW并不会做这道题,但是为了赢得CZF,他就来寻求你的帮助。
由于答案可能会很大,所以把最终的答案模1000000007。
我们规定运算X @ Y =((X and Y) or Y) xor X.

----------------------------------------------------------------------------------------------------------------------------------------------给定一个长度为72的数a(a是山形的),求0~a-1中有多少个数是山形的。http://codeforces.com/gym/100827 (E)
#include <cstdio>
#include <iostream>
#include <string>
#include <algorithm>
#include <cmath>
#include <vector>
#include <stack>
#include <queue>
#include <list>
#include <map>
#include <set>
#include <stdlib.h>
#include <sstream>
#include <assert.h>
#include <memory.h>
#include <complex>

#include <time.h>
#pragma comment(linker, "/STACK:100000000")
using namespace std;

#define mp make_pair
#define pb push_back
#define ll long long
#define sz(x) (int)(x).size()
#define fr(i,a,b) for(int i = (a);i <= (b);i++)

int ri(){int x;scanf("%d",&x);return x;}

ll dp[75][11][2][2];
string s;

ll go(int pos,int lst,int up,int e)
{
    if (pos == s.length())
        return 1;
    if (dp[pos][lst][up][e] != -1)
        return dp[pos][lst][up][e];
    ll res = 0;
    int f = e ? s[pos] - '0' : 9;
    int tmp = lst == 10 ? -1 : lst;
    for(int i = 0;i <= f;i++)
    {
        if (up)
        {
            if (i >= tmp)
                res += go(pos + 1,i,up,e & (i == f));
            else
                res += go(pos + 1,i,false,e & (i == f));
        }
        else
        {
            if (i <= tmp)
                res += go(pos + 1,i,false,e & (i == f));
        }
    }
    return dp[pos][lst][up][e] = res;
}

int main()
{
    //freopen("input.txt","rt",stdin);
    //freopen("insider.in","rt",stdin);
    //freopen("insider.out","wt",stdout);

    int T;
    scanf("%d", &T);
    while(T--)
    {
        cin >> s;
        while(s.length() > 1 && s[0] == '0')
            s = s.substr(1,s.length() - 1);
        bool check = true;
        int i;
        for(i = 1;i < s.length();i++)
        {
            if (s[i] >= s[i - 1]);
            else
                break;
        }
        for(;i < s.length();i++)
            if (s[i] > s[i - 1])
                check = false;
        if (check)
        {
            memset(dp,-1,sizeof(dp));
            cout << go(0,10,1,1) - 1 << endl;
        }
        else
            cout << -1 << endl;
    }

    return 0;
}

 ------------------------------------------------------------------------------------------------------------------------------------------------

http://codeforces.com/problemset/problem/55/D

求一个区间内beautiful num的数量。(beautiful num:如果一个数能被它所有数位上的非0数整除,那么它就是一个beautiful num , 如12 ,15,而13不是)。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll ;
ll dp[20][2520][49] ;
int orm[2521] ;
int cnt ;
int bit[20] ;

void init () {
    for (int i = 1 ; i <= 2520 ; i ++) {
        if (2520%i == 0) orm[i] = ++ cnt ;
    }
}

ll calc (int pos , int pre , int lcm , int welt ) {
    if (pos == -1)
        return pre%lcm==0 ;
    if (welt == 0 && dp[pos][pre][orm[lcm]] != -1)
        return dp[pos][pre][orm[lcm]] ;
    int f = welt?bit[pos]:9 ;

    ll ret = 0 ;
    for (int i = 0 ; i <= f ; i ++) {
        int curpre = (pre*10+i)%2520 ;
        int curlcm = lcm ;
        if (i) curlcm = curlcm*i/__gcd(curlcm,i) ;
        ret += calc (pos-1,curpre,curlcm,welt && i==f) ;
    }
    //cout << "pos = " << pos << " pre = " << pre << " lcm = " << lcm << " welt = " << welt << endl ;
    //cout << "ret = " << ret << endl ;
    if (welt == 0) dp[pos][pre][orm[lcm]] = ret ;
    return ret ;
}

ll work (ll x) {
    int pos=0 ;
    while (x) {bit[pos++]=x%10;x/=10;}
    return calc(pos-1 , 0 , 1 , 1) ;
}

int main () {
    init () ;
    int T ;
    cin >> T ;
    memset (dp , -1 , sizeof(dp)) ;
    //cout << "cnt = " << cnt << endl ;
    while (T --) {
        ll l , r ;
        cin >> l >> r ;
        cout << work(r)-work(l-1) << endl ;
    }
    return 0 ;
}

  

 

 

数位dp模板的更多相关文章

  1. 数位dp模板 [dp][数位dp]

    现在才想到要学数位dp,我是不是很弱 答案是肯定的 以一道自己瞎掰的题为模板 //题: //输入数字n //从0枚举到n,计算这n+1个数中含有两位数a的数的个数 //如12930含有两位数93 #i ...

  2. 转载:数位DP模板

    // pos = 当前处理的位置(一般从高位到低位) 2 // pre = 上一个位的数字(更高的那一位) 3 // status = 要达到的状态,如果为1则可以认为找到了答案,到时候用来返回, 4 ...

  3. 浅谈数位DP

    在了解数位dp之前,先来看一个问题: 例1.求a~b中不包含49的数的个数. 0 < a.b < 2*10^9 注意到n的数据范围非常大,暴力求解是不可能的,考虑dp,如果直接记录下数字, ...

  4. 数位dp/记忆化搜索

    一.引例 #1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an  ...

  5. 数位DP专题

    这周开始刷数位DP,在网上找到一份神级数位DP模板,做起题目来爽歪歪. http://www.cnblogs.com/jffifa/archive/2012/08/17/2644847.html in ...

  6. 数位dp总结

    由简单到稍微难点. 从网上搜了10到数位dp的题目,有几道还是很难想到的,前几道基本都是模板题,供入门用. 点开即可看题解. hdu3555 Bomb hdu3652 B-number hdu2089 ...

  7. 数位DP之奥义

    恩是的没错数位DP的奥义就是一个简练的dfs模板 int dfs(int position, int condition, bool boundary) { ) return (condition ? ...

  8. hdu 5898 odd-even number 数位DP

    传送门:hdu 5898 odd-even number 思路:数位DP,套着数位DP的模板搞一发就可以了不过要注意前导0的处理,dp[pos][pre][status][ze] pos:当前处理的位 ...

  9. hdu 3709 数位dp

    数位dp,有了进一步的了解,模板也可以优化一下了 题意:找出区间内平衡数的个数,所谓的平衡数,就是以这个数字的某一位为支点,另外两边的数字大小乘以力矩之和相等,即为平衡数例如4139,以3为支点4*2 ...

随机推荐

  1. nodejs进阶(5)—接收请求参数

    1. get请求参数接收 我们简单举一个需要接收参数的例子 如果有个查找功能,查找关键词需要从url里接收,http://localhost:8000/search?keyword=地球.通过前面的进 ...

  2. 利用Docker技术实现UDP广播效果(网络编程python版)

    docker的安装见官方文档 我使用的系统为Ubuntu16.04 Ubuntu系统安装docker文档地址:https://docs.docker.com/engine/installation/l ...

  3. svg拉伸,原来凹凸可以这么玩

    原文:http://www.smartjava.org/content/render-geographic-information-3d-threejs-and-d3js The last coupl ...

  4. time &amp; datetime

    时间相关的操作,时间有三种表示方式: 时间戳               1970年1月1日之后的秒,即:time.time() 格式化的字符串    2014-11-11 11:11,    即:t ...

  5. 【安装Express】CentOS7 下安装NodeJs+Express+MongoDB+Redis

    上一篇介绍了一下怎么安装Nodejs,那么这一篇就说说怎么安装express,express有个中文站点非常非常方便,http://www.expressjs.com.cn/创建express框架的站 ...

  6. 初识linux端c++程序开发

    关于linux端程序开发,我以前一直不知道是做些什么,只是感觉听高端的.最近接触了一些,有了一些初步的认识. 首先,linux是一个操作系统,跟windows一样:接通电源.按下电脑开机,电脑就会自动 ...

  7. Linux课程实践一:Linux基础实践(SSH)

    一.SSH服务 1. 安装SSH (1)查看是否已经安装过ssh服务 rpm -qa |grep ssh (2)进行安装 sudo apt-get install openssh-server Ubu ...

  8. PHP中静态与抽象的概念

    静态//普通成员//普通成员是属于对象的 //静态成员//静态成员属于类的 类中的静态属性非常类似于函数的全局变量.类中的静态成员是不需要对象而使用类名来直接访问的. //关键字:static//se ...

  9. java面试笔试

    一.String,StringBuffer, StringBuilder 的区别是什么?String为什么是不可变的? String在Java中是final的类,所以不可变:StringBuffer是 ...

  10. nyoj 68 三点顺序

    点击打开链接 三点顺序 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 现在给你不共线的三个点A,B,C的坐标,它们一定能组成一个三角形,现在让你判断A,B,C是顺时针给 ...