hdu 5179 (DFS)

求区间[L,R]内的beautiful number的个数。
求出不超过L、R的beautiful number的个数sum(L),sum(R),结果即为sum(R)-sum(L-1)

对于一个数num,从低位开始构造,由1开始枚举。若num大于当前构造的数则继续递归,否则返回结果。

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<map>
#include<set>
#include<stack>
#include<queue>
#include<vector>
#include<cstring>
using namespace std;
#define LL __int64

LL sum(LL x,LL len,LL prex,LL num)    //之前得到的数、当前位的权值、前一位(低位)上的数、所求的数
{
    LL ans=1;
    for(LL i=prex;i<=9;i+=prex)        //高一位上的数只能是低位的倍数
    {
        LL next=len*i+x;    //得到下一位
        if(next<=num) ans+=sum(next,len*10,i,num);
    }
    return ans;
}
LL sum(LL num)
{
    LL ans=0;
    for(LL i=1;i<=9;++i)
        if(x>=i) ans+=sum(i,10,i,num);
    return ans;
}
int main()
{
    LL T,L,R;
    scanf("%I64d",&T);
    while(T--)
    {
        scanf("%I64d%I64d",&L,&R);
        printf("%I64d\n",sum(R)-sum(L-1));
    }
    return 0;
}


 

你可能感兴趣的:(hdu 5179 (DFS))