标签:
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; }
标签:
原文地址:http://www.cnblogs.com/kylehz/p/4316272.html