题意:
里有多少个数包含了.

思路:
典型的特定数字问题,数位入门题。

,表示第位,当前位是不是,是否出现了.
刚开始没有加第三维,一直对不上案例,后面发现只有两维的保存的结果不一定能通用,比如:
前两个可以是同一个结果,但第三个和前两个不一样,可以任意取。

Code:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e3+7;
inline ll read() {
    ll s = 0, w = 1;
    char ch = getchar();
    while (ch < 48 || ch > 57) {
        if (ch == '-') w = -1;
        ch = getchar();
    }
    while (ch >= 48 && ch <= 57)
        s = (s << 1) + (s << 3) + (ch ^ 48), ch = getchar();
    return s * w;
}
ll dp[20][2][2];
int digit[20];
ll dfs(int len,int pos,bool tot,bool limit,int sum) {
    if(!len) return tot;
    if(!limit&&dp[len][pos==4][tot]!=-1) return dp[len][pos==4][tot];
    int endi=(limit?digit[len]:9);
    ll ans=0;
    for(int i=0;i<=endi;++i) {
        ans+=dfs(len-1,i,tot||pos==4&&i==9,limit&&i==endi,sum*10+i);
    }
    if(!limit) dp[len][pos==4][tot]=ans;
    return ans;
}
ll solve(ll n) {
    int len=0;
    while(n) {
        digit[++len]=n%10;
        n/=10;
    }
    return dfs(len,0,false,true,0);
}
int main() {
    int t=read();
    memset(dp,-1,sizeof dp);
    ll n;
    while(t--) {
        n=read();
        printf("%lld\n",solve(n));
    }
    return 0;
}