http://codeforces.com/group/w1oiqifZbS/contest/1036/problem/C
①先查找,存入vector(dfs)-->排序(sort)-->二分(lower_bound,upper_bound)
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<stdlib.h> 6 #include<algorithm> 7 #include<queue> 8 #include<vector> 9 #include<string> 10 #include<set> 11 #include<cctype> 12 #include<sstream> 13 #define mem(a) memset(a,0,sizeof(a)) 14 #define LL long long 15 using namespace std; 16 const int N=1e6+5; 17 vector<LL> ve; 18 LL n,l,r,m; 19 void dfs(LL now,int sum,int len) 20 { 21 ve.push_back(now); 22 if(len==18)return; 23 dfs(now*10,sum,len+1); //十的倍数 24 if(sum<3) 25 { 26 for(int i=1;i<=9;i++) 27 dfs(now*10+i,sum+1,len+1);//其他,加一---非零 28 } 29 } 30 int main() 31 { 32 for(int i=1;i<=9;i++) //找到符合条件的数 33 dfs(i,1,1); 34 ve.push_back(1e18);//范围,不超过,且1e18符合 35 sort(ve.begin(),ve.end()); //lo,up要先排序 36 int t; 37 scanf("%d",&t); 38 while(t--) 39 { 40 scanf("%I64d%I64d",&l,&r); 41 /*二分查找*/ 42 int L=lower_bound(ve.begin(),ve.end(),l)-ve.begin();//返回第一个大于等于元素的下标 43 int R=upper_bound(ve.begin(),ve.end(),r)-ve.begin();//返回第一个大于的元素的下标; 44 printf("%d ",R-L); //因为是up-lo,所以不用+1,且两个都是lo的话+1会在lr相等时出错 45 } 46 return 0; 47 }
②查到发现还可以用数位DP mark一下