Robbers' watch CodeForces - 686C

原题链接
考察:DFS
错误思路:
  一开始想的是数位dp,然后发现数字是由两部分构成,后面取值范围不仅取决于后面的数字是否取到了\(a[pos]\),也取决于前面数字是否取到最值.然后发现数位dp做不了= =

正确思路:
  可以发现数字最多是7位,不考虑7位上重复最多\(7^7\)种方法.直接DFS枚举,再分段判断是否可行.

Code

#include <iostream>
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 60;
int m,n,bm,bn,ans,a[N];
int get(int n)
{
	int res = 0;
	while(n)
	{
		res++;
		n/=7;
	}
	return res;
}
bool check()
{
	int res = 0;
	for(int i=bn+bm;i>bm;i--)
	  res = res*7+a[i];
	if(res>=n) return 0;
	res = 0;
	for(int i=bm;i>=1;i--)
	  res = res*7+a[i];
	return res<m;
}
void dfs(int pos,int st)
{
	if(pos>bm+bn)
	{
		if(check()) ans++;
		return;
	}
	for(int i=0;i<7;i++)
	  if(!(st>>i&1))
	  {
	  	a[pos] = i;
	  	dfs(pos+1,st|(1<<i));
	  }
}
int main()
{
	scanf("%d%d",&m,&n);
	bm = max(get(m-1),1),bn = max(get(n-1),1);
	dfs(1,0);
	printf("%d\n",ans);
	return 0;
}
posted @ 2021-07-17 09:18  acmloser  阅读(36)  评论(0编辑  收藏  举报