?
# | Author | Problem | Lang | Verdict | Time | Memory | Sent | Judged | |
---|---|---|---|---|---|---|---|---|---|
188224157 |
Practice: DaiRuiChen007 |
1560F2 - 30 | C++14 (GCC 6-32) | Accepted | 889 ms | 64 KB | 2023-01-06 17:20:56 | 2023-01-06 17:20:56 |
// LUOGU_RID: 98870181 #include<bits/stdc++.h> using namespace std; const int MAXN=11,MAXS=1<<10; const int b[]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000}; inline int bit(int x) { return 1<<x; } int n,k,dp[MAXN][MAXS],a[MAXN]; bool vis[MAXN][MAXS]; inline int dfs(int dig,int S,bool lim,bool qd) { if(dig<0) return __builtin_popcount(S)<=k?0:-1; if(!lim&&vis[dig][S]) return dp[dig][S]; int ret=-1; for(int i=(lim?a[dig]:0);i<10;++i) { int k=dfs(dig-1,(qd&&i==0)?0:S|bit(i),lim&&(i==a[dig]),qd&&(i==0)); if(k!=-1) { ret=b[dig]*i+k; break; } } if(!lim) vis[dig][S]=true,dp[dig][S]=ret; return ret; } inline void solve() { memset(dp,-1,sizeof(dp)); memset(vis,false,sizeof(vis)); scanf("%d%d",&n,&k); int len=0; while(n) { a[len]=n%10; n/=10,++len; } for(int i=len;i<=9;++i) a[i]=0; printf("%d\n",dfs(9,0,true,true)); } signed main() { int T; scanf("%d",&T); while(T--) solve(); return 0; }
?
?
?
?