FZU - 1896 神奇的魔法数

原创 2013年12月03日 23:17:01

Description

John定义了一种“神奇的魔法数”。 不含前导零且相邻两个数字之差至少为m的正整数被称为“神奇的魔法数”。特别的,对于任意的m,数字1..9都是“神奇的魔法数”。
John想知道,对于给定的m,在正整数a和b之间,包括a和b,总共有多少个“神奇的魔法数”?

Input

第一行一个数字T(1<=T<=100),表示测试数据组数。
接下来T行,每行代表一组测试数据,包括三个整数a,b,m。(1<=a<=b<=2,000,000,000, 0<=m<=9)

Output

对于每组测试数据,输出一行表示“神奇的魔法数”的个数。

Sample Input

7
1 10 2
1 20 3
1 100 0
10 20 4
20 30 5
1 10 9
11 100 9

Sample Output

9
15
100
5
3
9
1
思路:dp[i][j]表示前i位最高位是j的神奇的魔法数的个数,那么分别统计小于a,b+1
的神奇的魔法数的个数就对了
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

int dp[15][10];
int m;

void init(){
    memset(dp,0,sizeof(dp));
    for (int i = 0; i < 10; i++)
        dp[1][i] = 1;
    for (int i = 2; i < 12; i++)
        for (int j = 0; j < 10; j++)
            for (int k = 0; k < 10; k++)
                if (abs(j-k) >= m)
                    dp[i][j] += dp[i-1][k];
}

int solve(int n){
    int bit[15] = {0},len = 0;
    while (n){
        bit[++len] = n % 10;
        n /= 10;
    }
    int ans = 0;
    for (int i = 1; i < len; i++)
        for (int j = 1; j < 10; j++)
            ans += dp[i][j];
    for (int i = 1; i < bit[len]; i++)
        ans += dp[len][i];
    for (int i = len-1; i > 0; i--){
        for (int j = 0; j < bit[i]; j++)
            if (abs(j-bit[i+1]) >= m)
                ans += dp[i][j];
        if (abs(bit[i]-bit[i+1]) < m)
            break;
    }
    return ans;
}

int main(){
    int l,r;
    int t;
    scanf("%d",&t);
    while (t--){
        scanf("%d%d%d",&l,&r,&m);
        init();
        printf("%d\n",solve(r+1)-solve(l));
    }
    return 0;
}


FZU 1896 — 神奇的魔法数

原题:http://acm.fzu.edu.cn/problem.php?pid=1896 思路: dp[i][j]表示前i位且最高位为j的魔法数个数; 然后将范围相减; #i...
  • L__emon
  • L__emon
  • 2015年05月16日 16:13
  • 341

FZU 1896 神奇的魔法数 数位DP

Problem 1896 神奇的魔法数 Accept: 143    Submit: 406 Time Limit: 1000 mSec    Memory Limit : 32768 K...
  • yskyskyer123
  • yskyskyer123
  • 2016年08月04日 09:02
  • 326

FZU 1896 神奇的魔法数( 组队题 )

解题思路: 用dp记录,一位以为算过去,一个数最高只有12位,不用担心超时问题   #include #include #include #include #include using...
  • YHYYXT
  • YHYYXT
  • 2015年05月17日 14:19
  • 418

[FOJ 1896] 神奇的魔法数

题目描述神奇的魔法数解题思路参考代码#include #include #include typedef long long ll; int m, dp[15][10]; void init()...
  • xmzyt1996
  • xmzyt1996
  • 2015年07月26日 17:20
  • 201

神奇的魔法数

神奇的魔法数 Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on FZU. Origi...
  • u013667751
  • u013667751
  • 2014年08月13日 00:49
  • 660

java中的魔法数

说明:所谓魔法数值,是指在代码中直接出现的数值,而只有在这个数值记述的那部分代码中才能明确了解其含义。   魔法数值使代码的可读性大大下降。而且,如果同样的数值多次出现时,到底这些数值是不是...
  • woshixuye
  • woshixuye
  • 2012年03月17日 10:47
  • 7124

魔法数 0x7FFE0030

在工程中看到一个魔法数, (WCHAR*)0x7FFE0030 想替换这个魔法数为其他可理解的值. 试验出一种方法, 当我们在重构和逆向时,遇到一个地址类型的魔法数, 可以采用这种方法确定...
  • andylau00j
  • andylau00j
  • 2014年03月24日 17:01
  • 1264

魔法数字

说明:所谓魔法数值,是指在代码中直接出现的数值,只有在这个数值记述的那部分代码中才能明确了解其含义。  魔法数值使代码的可读性大大下降。而且,如果同样的数值多次出现时,到底这些数值是不是带有同样的含义...
  • GEOLO
  • GEOLO
  • 2015年04月01日 18:37
  • 1990

实数求根的一种快速实现方法

实数求根的一种快速实现方法 说明:本文主要根据如下链接的文章改写整理而成,框图及代码均为原文作者提供,版权归原文作者所有。有版权问题请联系博主。 http://ieeexplore.i...
  • deepdsp
  • deepdsp
  • 2012年05月06日 16:58
  • 1712

0x5f3759df这个快速开方中的常数的数学依据和原理

Quake-III Arena (雷神之锤3)是90年代的经典游戏之一。   该系列的游戏不但画面和内容不错,而且即使计算机配置低,也能极其流畅地运行。这要归功于它3D引擎的开发者约翰-卡...
  • u012966194
  • u012966194
  • 2017年01月20日 17:16
  • 339
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:FZU - 1896 神奇的魔法数
举报原因:
原因补充:

(最多只允许输入30个字)