Codeforces686C【dfs】

来源:互联网 发布:南大碎尸 知乎 编辑:程序博客网 时间:2024/06/07 15:04

题意:
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;}
0 0
原创粉丝点击