#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. C# API项目代码正确 ,页面出不来的问题

    C# API项目代码正确  页面出不来的问题,截图如下: 解决方法: 在项目里设置好[起始页],就可以了.

  2. bash 相关的一些小代码片断

    批量修改文件名: for i in *.html; do mv $i ${i/oldstring/newstring}; done; 批量替换文件内容: sed -i "s/oldstrin ...

  3. 二、activity与Intent

    (一) 多个activity之间的跳转(无值传递) 第一步:创建activity(其实就是jave文件),并进行注册 在AndroidManifest.xml中 <activity androi ...

  4. PHP 小方法之 二维数组排序

    if (! function_exists ( 'multi_array_sort' )) { function multi_array_sort($arr, $keys, $type = 'desc ...

  5. .NET微信通过授权获取用户的基本信息

    一.填写授权回调页面的域名 二.引导用户到指定的授权页面 例如:https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID& ...

  6. 下载python标准库--python

    #coding:utf-8 import urllib2 import os,sys from BeautifulSoup import BeautifulSoup # For processing ...

  7. 锋利的jQuery-4--动画方法总结简表

  8. zookeeper 用法和日常运维

    本文以ZooKeeper3.4.3版本的官方指南为基础:http://zookeeper.apache.org/doc/r3.4.3/zookeeperAdmin.html,补充一些作者运维实践中的要 ...

  9. 将txt文件数据转成bin文件.

    之前用牛逼的绘图以及分析bmp的像素文件的方法, 整理出汉字编码从: 0x4E00到0x9FA5, (维基上说是9FD5, 完了, 回头再更新吧.) https://en.wikipedia.org/ ...

  10. PIC和PIE

    PIC指的是位置无关代码,用于生成位置无关的共享库,所谓位置无关,指的是共享库的代码断是只读的,存放在代码段,多个进程可同时公用这份代码段而不需要拷贝副本.库中的变量(全局变量和静态变量)通过GOT表 ...