#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. Rafy 框架 - 插件级别的扩展点

    本章说明如何使用额外的插件(如客户化插件)对另一插件(如产品插件)进行扩展.   使用场景 在 产品线工程 中,项目的研发分为领域工程和应用工程.这个过程中会需要对领域工程中的内容进行大量的扩展.   ...

  2. iOS-APP提交上架流程(新手必看!2016年3月1日最新版)

    自己的经验总结,有错的话请留言,第一时间更改. 先大概说一下iOSAPP上架的几个步骤(详细步骤见下图): 创建证书请求文件 登录苹果开发者中心生成发布者证书(下载下来要双击一下) 设置APPID(要 ...

  3. jQuery Colorpicker Spectrum api 中文 文档 属性 事件 方法

    jQuery Colorpicker Spectrum 所需的CSS和JavaScript文件: <script src='spectrum.js'></script> < ...

  4. meta 标签的作用

    META标签,是HTML语言HEAD区的一个辅助性标签.在几乎所有的page里,我们都可以看到类似下面这段htm l代码: <head> <meta http-equiv=" ...

  5. JAVA设计模式--工厂方法模式

    工厂方法设计模式 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关.是具体工厂角色必须实现的接口或者必须继承的父类.在java中它由抽象类或者接口来实现.具体工厂角色:它含有和具体业务逻辑有关 ...

  6. 使用 TOP 限制更新的数据

    可以使用 TOP 子句来限制 UPDATE 语句中修改的行数.当 TOP (n) 子句与 UPDATE 一起使用时,将针对随机选择的 n 行执行删除操作.例如,假设您要为一位高级销售人员减轻销售负担, ...

  7. java web

    1,当访问完一个网页的时候,浏览器会有缓存,当你再次输入原来的网站是会有从远端传来的网页缓存,所以在测试的时候要清除缓存才行

  8. August 10th, 2016, Week 33rd, Wednesday

    The degree of loving is measured by the degree of giving. 爱的深浅是用给与的多少来衡量的. Some say that if you love ...

  9. OpenERP/Odoo命令行参数

    http://blog.sina.com.cn/s/blog_7cb52fa80102v8h1.html

  10. services 文件

    Services 文件列出了服务使用的标准端口号.可以向表中添加自己定义的项,来给自己的服务选择.(安装在Windows目录下的一个子目录中,取决于Windows版本) # Copyright (c) ...