#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+二分]相关的知识,希望对你有一定的参考价值。

LINK

考虑数位 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 1021010

对于每组询问 n n n,我们先使用数位 d p dp dp求出 [ 1 , n − 1 ] [1,n-1] [1,n1] 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)

Codeforces Round #739 (Div. 3)

Codeforces Round #739 (Div. 3) 题解