HDU1579 beautiful number

 

 
题目贴上来有点问题。。。。就贴个数据把
Sample Input
2 1 11 999999993 999999999
Sample Output
10 2

题意:问你 [L,R] 区间里的数符合 前位大于后卫,且每个前位都能被任何一个后卫数整除 的数的个数。


代码:

 

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <vector>
#include <cstring>
using namespace std;
#define LL long long
int dp[15][15];
int cal(int cc)
{
    if(cc == 0)return 0;
    int v[15],cnt(1);
    while(cc)
    {
        v[cnt++] = cc % 10;
        cc /= 10;
    }
    cnt--;//数的位数
    LL ans = 0;
    for(int i=1; i<cnt; i++)//小一位都先加上如1476先加上999内的。。。。
        for(int j=1; j<=9; j++)
        {
            ans += dp[i][j];
        }
    int i, pre = -1;
    for(i=cnt; i>0; i--)
    {
        for(int j=1; j<v[i]; j++)
        {
            if(pre == -1 || pre % j == 0)
                ans += dp[i][j];
        }
        if(pre == -1) pre = v[i];
        else
        {
            if(v[i] == 0 || pre % v[i] != 0)break;
            else
                pre = v[i];
        }
    }
    if(i <= 0)ans++;//本身是一个
    return ans;
}
int main()
{
    //freopen("in.txt","r",stdin);
    for(int i=1; i<=9; i++)
        dp[1][i] = 1;
    for(int i=2; i<=10; i++)
        for(int j=1; j<=9; j++)
            for(int k=1; k<=9; k++)
            {
                if(k % j == 0)
                    dp[i][k] += dp[i-1][j];
            }
    int t, L, R;
    cin >> t;
    while(t--)
    {
        scanf("%d%d",&L,&R);
        cout << cal(R)-cal(L-1)<<endl;
    }
}
View Code

 

风格不错的代码:

 

#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
using namespace std;

const int DIT = 15;
const int MAXD = 15;
int f[MAXD][DIT], a[MAXD];

void prework()
{
    for (int i = 1; i <= 9; ++i) f[1][i] = 1;
    for (int i = 2; i <= 10; ++i) {
        for (int j = 1; j <= 9; ++j) {
            for (int l = 1; l <= j; ++l) {
                if (j % l == 0) {
                    f[i][j] += f[i-1][l];
                }
            }
        }
    }
}
int low(int d)
{
    int res = 0;
    for (int i = 1; i < d; ++i) {
        for (int j = 1; j <= 9; ++j) {
            res += f[i][j];
        }
    }
    return res;
}
int calc(int x, int d)
{
    int res = 0;
    for (int i = 1; i < a[d]; ++i) {
        res += f[d][i];
    }
    while (d) {
        if (a[d-1] > a[d]) {
            res += f[d][a[d]];
            return res;
        }
        for (int i = 1; i < a[d-1]; ++i) {
            if (a[d] % i == 0) {
                res += f[d-1][i];
            }
        }
        if (a[d-1] == 0 || a[d] % a[d-1] != 0return res;
        --d;
    }
    return res+1;
}
int work(int x)
{
    if (x < 10return x;
    int d = 0;
    while (x) {
        a[++d] = x%10;
        x /= 10;
    }
    int res = low(d);
    res += calc(x, d);
    return res;
}
int main()
{
    int T;
    scanf("%d", &T);
    prework();
    a[0] = 1;
    while (T--) {
        int l, r;
        scanf("%d%d", &l, &r);
        printf("%d\n", work(r) - work(l-1));
    }
    return 0;
}
View Code

 

posted @ 2015-03-01 21:13  Doli  阅读(92)  评论(0)    收藏  举报