Codeforces686C【dfs】
题意:
n,m<=1e9
设定一天n小时,一小时m分钟,
显示时间的是一个7进制的表,
问你在一天里出现多少个时刻,表中的数字要都不相同。
思路:
因为7进制,显示的数字肯定是0-7之间的。
然后就是搜一下,注意显示的方式,所以m分钟有几位就是显示几位
#include <bits/stdc++.h>
#include<algorithm>
using namespace std;
typedef __int64 LL;
int mm[25],hh[25];
bool vis[10];
LL ans,shi,fen;
int cnt1,cnt2;
LL n,m;
void dfs_hh(int num,LL shi)
{
if(num==cnt1)
{
if(shi<n)
{
ans++;
return;
}
}
for(int i=0;i<7;i++)
{
if(!vis[i])
{
shi+=(LL)pow(7,num)*(LL)i;
vis[i]=1;
dfs_hh(num+1,shi);
vis[i]=0;
shi-=(LL)pow(7,num)*(LL)i;
}
}
}
void dfs_mm(int num,LL fen)
{
if(num==cnt2)
{
if(fen<m)
{
dfs_hh(0,0);
return;
}
}
for(int i=0;i<7;i++)
{
if(!vis[i])
{
vis[i]=1;
fen+=(LL)pow(7,num)*(LL)i;
dfs_mm(num+1,fen);
vis[i]=0;
fen-=(LL)pow(7,num)*(LL)i;
}
}
}
int main()
{
scanf("%I64d%I64d",&n,&m);
LL nn,mm;
nn=n,mm=m;
if(nn>1) nn--;
if(mm>1) mm--;
cnt1=cnt2=0;
while(nn)
{
++cnt1;
nn/=7;
}
while(mm)
{
++cnt2;
mm/=7;
}
ans=0;
memset(vis,0,sizeof(vis));
dfs_mm(0,0);
printf("%I64d\n",ans);
return 0;
}