#739 (Div. 3) 1560. F2. Nearest Beautiful Number (hard version)[数位dp+二分]
Posted issue是fw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了#739 (Div. 3) 1560. F2. Nearest Beautiful Number (hard version)[数位dp+二分]相关的知识,希望对你有一定的参考价值。
考虑数位 d p dp dp,对于不超过 k k k种数字的限制,我们使用一个 10 10 10位的二进制数来表示 [ 0 , 9 ] [0,9] [0,9]是否已经出现过
定义 f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k]表示高位枚举到低位的第 i i i位,已有数字的二进制状态为 j j j,在不超过 k k k种数字的限制下有多少个数满足限制
这样数位 d p dp dp的复杂度是 10 ∗ 2 10 ∗ 10 10*2^{10}*10 10∗210∗10
对于每组询问 n n n,我们先使用数位 d p dp dp求出 [ 1 , n − 1 ] [1,n-1] [1,n−1]有 x x x个数满足条件
然后对于 [ n , 1 0 10 ] [n,10^{10}] [n,1010]去二分一个最小的数 z z z使得 [ 1 , z ] [1,z] [1,z]有 x + 1 x+1 x+1个数满足条件
显然 z z z就是答案
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn = 5e5+10;
int f[12][1<<10][12],a[22],lg[1<<10],n,k,ok[31];
int dfs(int len,int sta,int lead,int limit)
{
if( !len ) return ( !lead && lg[sta]<=k );
if( !lead && !limit && f[len][sta][k]!=-1 )
return f[len][sta][k];
int las = limit?a[len]:9, ans = 0;
for(int i=0;i<=las;i++)
{
if( lead&&i==0 )
ans = ans+dfs(len-1,sta,lead,limit&(i==las) );
else
{
int newsta = sta|(1<<i);
if( lg[newsta]<=k )
{
int x = dfs(len-1,newsta,0,limit&(i==las));
ans = ans+x;
}
}
}
if( !lead && !limit ) f[len][sta][k] = ans;
return ans;
}
int solve(int n)
{
memset( a,0,sizeof a );
while( n ) a[++a[0]] = n%10, n/=10;
return dfs( a[0],0,1,1 );
}
int isok(int n)
{
memset( ok,0,sizeof ok );
memset( a,0,sizeof a );
while( n ) a[++a[0]] = n%10, n/=10;
int s = 0;
for(int i=1;i<=a[0];i++)
if( ok[a[i]]==0 ) ok[a[i]] = 1, s++;
return s;
}
int z(int n)
{
int ans = 0;
for(int i=1;i<=n;i++)
if( isok(i)<=k ) ans++;
return ans;
}
signed main()
{
memset( f,-1,sizeof f );
for(int i=1;i<1024;i++) lg[i] = lg[i>>1]+(i&1);
int t; cin >> t;
while( t-- )
{
cin >> n >> k;
int x = solve(n-1), l = n, r = 1e10, ans = 0;
while( r>=l )
{
int mid = l+r>>1;
if( solve(mid)>x ) r = mid-1, ans = mid;
else l = mid+1;
}
cout << ans << endl;
}
}
以上是关于#739 (Div. 3) 1560. F2. Nearest Beautiful Number (hard version)[数位dp+二分]的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #739 (Div. 3) ABCDEF1F2题解
Codeforces Round #739 (Div. 3)
Codeforces Round #739 (Div. 3) F1. Nearest Beautiful Number (easy version)
Codeforces Round #739 (Div. 3) F1. Nearest Beautiful Number (easy version)