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;
}