Educational Codeforces Round 50 (Rated for Div. 2) C. Classy Numbers(dfs構造某類數)
阿新 • • 發佈:2018-12-01
題意:找出區間[L, R]之間最多有三位是非零數字的十進位制數的個數;
思路:用構造出所有的滿足題意的數,然後排序,二分找;
#include <bits/stdc++.h> using namespace std; typedef long long ll; vector<ll> vec; void dfs(ll cur, int cnt, int len){ vec.push_back(cur); if(len==18) return; dfs(cur*10, cnt, len+1); if(cnt<3){ for(int i=1; i<=9; i++){ dfs(cur*10+i, cnt+1, len+1); } } } int main(){ for(int i=1; i<=9; i++) dfs(i, 1, 1); vec.push_back(1e18); sort(vec.begin(), vec.end()); int T; scanf("%d", &T); while(T--){ ll L, R; scanf("%lld%lld", &L, &R); int l=lower_bound(vec.begin(), vec.end(), L)-vec.begin(); int r=upper_bound(vec.begin(), vec.end(), R)-vec.begin(); cout << r-l << endl; } return 0; }