CodeForces 204A Little Elephant and Interval 数位DP

#include <cstdio>
#include <cstring>
using namespace std;
typedef __int64 LL;
int a[33];
LL dp[33][10];

LL dfs(int x, int s, int e, int flag, int first)
{
    if(x == -1)
        return s == e;
    if(!flag && dp[x][s]!= -1)
        return dp[x][s];
    int end = 9;
    if(flag)
        end = a[x];
    LL sum = 0;
    for(int i = 0; i <= end; i++)
    {
    	int st = s, ed = e;
        if(!first && i)
        	st = i;
       	if(x == 0)
       		ed = i;
        sum += dfs(x-1, st, ed, flag && i == end, first||i);
    }
    if(!flag)
        dp[x][s] = sum;
    return sum;
}
LL cal(LL x)
{
	if(x == 0)
		return 1;
    int l = 0;
    while(x)
    {
        a[l++] = x%10;
        x /= 10;
    }
    return dfs(l-1, 0, -1, 1, 0);
}
int main()
{
    int T;
    memset(dp, -1, sizeof(dp));
    LL x, y;
    while(scanf("%I64d %I64d", &x, &y) != EOF)
    {
        if(!x && !y)
            break;
        printf("%I64d\n", cal(y)-cal(x-1));
    }
    return 0;
}
时间: 2024-10-26 18:25:46

CodeForces 204A Little Elephant and Interval 数位DP的相关文章

CodeForces 258B Little Elephant and Elections 数位DP

前面先用数位DP预处理,然后暴力计算组合方式即可. #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib> #include

[Codeforces 258B &amp; 259 D]Little Elephant and Elections 数位dp+dfs

http://codeforces.com/problemset/problem/258/B 题目大意: 说七个party选择数字(各不相同) 而规定的小象的party选择的数字之中所拥有的数字4和7的个数要比其他六个party拥有的个数之和还要严格多,询问方案数. 如m=7时其余的随意选择至少会拥有一个4或7,与题意矛盾,故方案数为0 m=8时,7 1 2 3 5 6 8是一种合法方案 思路: 由于小象的party选到的数字所含4和7的个数至多和m的位数一样多,则枚举小象的party所含4和7

Codeforces Beta Round #51---D. Beautiful numbers(数位dp, 巧妙)

Volodya is an odd boy and his taste is strange as well. It seems to him that a positive integer number is beautiful if and only if it is divisible by each of its nonzero digits. We will not argue with this and just count the quantity of beautiful num

Codeforces Round #157 (Div. 1)B 数位dp

//枚举有几个(7或4),用数位dp的记忆化搜索找有i个(7或4)的数又多少个 //暴力搜索在第i个中选几个 #include<cstdio> #include<cstring> #include<iostream> using namespace std ; const int mod = 1e9 + 7; int dp[20][20];//第i位有 j个数(7或者4) int bit[20] ; int temp[20]; int luck[20]; int dfs

CodeForces - 1073E :Segment Sum (数位DP)

You are given two integers l l and r r (l≤r l≤r ). Your task is to calculate the sum of numbers from l l to r r (including l l and r r ) such that each number contains at most k k different digits, and print this sum modulo 998244353 998244353 . For

Codeforces Round #387 (Div. 2) 747F(数位DP)

题目大意 给出整数k和t,需要产生一个满足以下要求的第k个十六进制数 即十六进制数每一位上的数出现的次数不超过t 首先我们先这样考虑,如果给你了0~f每个数字可以使用的次数num[i],如何求长度为L且满足要求的十六进制数有多少个 dp[i][l]表示使用了前i个数字,已经将L的空位填上了l个的数有多少个 转移方程 dp[i][l] = sigma(dp[i-1][l-j]*C[len-l+j[j]) 其中j是枚举填新的数的个数,C是组合数(选出j个空位填上新数) 有了这个dp后,现在的问题就变

codeforces 204A A. Little Elephant and Interval(dp+组合数学)

题目链接: codeforces 204A 题目大意: 给出一个l和r,求取在l和r之间的首尾相同的数的个数. 题目分析: 按位进行统计,计算出不大于某一个数的所有的合法的情况.然后可以利用这个前缀和求取区间和. 按位统计的时候,首先特判数的长度为1位和两位的情况,分别是10和9,如果当前数就是1位,那么就是这个数的大小,其他具体细节见代码. 然后就是统计所有不足位的情况,也就是数的长度不到给定数长度的情况,不足位的数一定小于给定数,所以直接固定首尾,结果加上10n?2即可. 足位的情况,就是枚

codeforces Hill Number 数位dp

http://www.codeforces.com/gym/100827/attachments Hill Number Time Limits:  5000 MS   Memory Limits:  200000 KB 64-bit interger IO format:  %lld   Java class name:  Main Description A Hill Number is a number whose digits possibly rise and then possibl

Codeforces 55D (数位DP+离散化+数论)

题目链接: http://poj.org/problem?id=2117 题目大意:统计一个范围内数的个数,要求该数能被各位上的数整除.范围2^64. 解题思路: 一开始SB地开了10维数组记录情况. 首先要求能被各位上的数整除,可以转化为被一个数整除问题. 这个数就是各位上数的最小公倍数LCM(不是GCD). 其次,处理整除问题,得转化成数位DP的余数模板.1~9的LCM最大是2520, 那么%2520,让其可以开数组进行记忆化搜索. 最后, 对于不能%2520最后结果,再%各个数位累计过来的