http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?pid=1002&cid=569

题意是求L与R之间的完美的数,即从左到与右非递减排列,并且左边的数能整除右边的数 如931 ,999

只要相邻的数能整除,其他也能整除。所以只要判断相邻数是否整除就可以了

dfs ,记录当前的值与层次,当层次到达R的位数时return,

每次选择新数字的范围是0-9,再通过判断是否在LR之间以及相邻数是否整除即可

ps:此题应优先暴力出数据提交即可

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,len;
int nr[20],mr[20];
int cnt;
char s1[20],s2[20];
void getarr()
{
    len=strlen(s2);
    int len1=strlen(s1);
    mr[0]=s2[0]-'0';
    for(int i=1;i<len;i++)mr[i]=mr[i-1]*10+s2[i]-'0';
    for(int i=0;i<len-len1;i++)nr[i]=0;
    for(int i=len-len1;i<len;i++)nr[i]=nr[i-1]*10+s1[i-(len-len1)]-'0';
}
bool jud(int num)
{
    if(num==0)return true;
    if(num%10==0)return false;
    int p=num%100/10;
    int q=num%10;
    if(p==0||p%q==0)return true;
    else return false;
}
void dfs(int num,int k)
{
    if(k==len)
    {
        cnt++;
        return;
    }
   for(int i=0;i<=9;i++)
   {
       int p=num*10+i;
       if(p>=nr[k]&&p<=mr[k]&&jud(p))
       {
           dfs(p,k+1);
       }
   }
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%s%s",&s1,&s2);
        getarr();
        cnt=0;
        dfs(0,0);
        printf("%d\n",cnt);
    }
    return 0;
}

 

posted on 2015-03-05 16:51  kylehz  阅读(120)  评论(0)    收藏  举报