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
",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934871.html