题目链接:http://codeforces.com/contest/686/problem/C
题目大意:
给你两个十进制的数n和m,选一个范围在[0,n)的整数a,选一个范围在[0,m)的整数b,要求a的7进制表示和b的7进制表示中的每一位都不重复。其中,a的7进制位数和n-1的7进制位数相同,b的位数和m-1的位数相同。
比如,当n=2,m=3时,a和b的其进制表示的所有集合是:
a=0, b=1
a=0, b=2
a=1, b=0
a=1, b=2
解法:
这套题目可以用dfs做。
我们开一个数组f[],f[i]表示数字i有没有在a和b的七进制表示中出现过。
然后我们遍历a和b的每一位,如果在判断这个数的第i位的时候恰好f[i]=false,我们就可以将f[i]设为true,并将这一位的值设成i,然后继续搜索。
假设我们已经通过搜索得到了a,此时边有一个确定的a(a不是我们答案里需要的,但是我们搜索的过程中实际上会遍历得到所有合法的a)以及一个确定的f[]数组。此时按照dfs_m()函数求得b(b也不是答案里需要的),如果b合法,则ans++(ans是最终答案)。
dfs_m()函数如下(用它来得到b):

void dfs_m(int tmp, int tm) {if (tmp >= m) return;if (tm < 0) {ans ++;return;}for (int i = 0; i < maxn; i ++) {if (f[i] == false) {f[i] = true;dfs_m(tmp + i * g[tm], tm-1);f[i] = false;}}
}

我们已经有了dfs_m()了,那么只要我们在找b之前找到每一个a就行了,找a的方法也是dfs,如下的dfs_n()方法:

void dfs_n(int tmp, int tn) {if (tmp >= n) return;if (tn < 0) {dfs_m(0, mm-1);return;}for (int i = 0; i < maxn; i ++) {if (f[i] == false) {f[i] = true;dfs_n(tmp + i * g[tn], tn-1);f[i] = false;}}
}

完整代码:

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 7;
bool f[maxn];
int g[maxn], n, m, nn, mm;
long long ans = 0;
void init() {memset(f, false, sizeof(f));g[0] = 1;for (int i = 1; i < maxn; i ++)g[i] = g[i-1] * 7;
}
int chk(int n) {if (n == 1)return 1;n -= 1;int cnt = 0;while (n) {n /= 7;cnt ++;}return cnt;
}
void dfs_m(int tmp, int tm) {if (tmp >= m) return;if (tm < 0) {ans ++;return;}for (int i = 0; i < maxn; i ++) {if (f[i] == false) {f[i] = true;dfs_m(tmp + i * g[tm], tm-1);f[i] = false;}}
}
void dfs_n(int tmp, int tn) {if (tmp >= n) return;if (tn < 0) {dfs_m(0, mm-1);return;}for (int i = 0; i < maxn; i ++) {if (f[i] == false) {f[i] = true;dfs_n(tmp + i * g[tn], tn-1);f[i] = false;}}
}int main() {scanf("%d%d", &n, &m);init();if (n > m) swap(n, m);nn = chk(n);mm = chk(m);if (nn + mm > 7) {puts("0");return 0;}dfs_n(0, nn-1);cout << ans << endl;return 0;
}

转载于:https://www.cnblogs.com/moonlightpoet/p/5613075.html

Codeforces Round #359 (Div. 2) C. Robbers' watch 搜索相关推荐

  1. Codeforces Round #359 (Div. 2) C. Robbers' watch 暴力枚举

    题目链接 题意是真的烦,到最后才知道是n个m其实就是限定表的两个时区的位数,所以所当数不够填满时区的时候前边自动补零 思路:首先来说不能有重复的数字的话,小时和分钟的总位数大于7肯定不行. 7的7次方 ...

  2. Codeforces Round #359 (Div. 2) D. Kay and Snowflake

    题目链接:传送门 题目大意:给你n个点,n-1条边连接所有点构成一棵树,1是树根,有m次询问,对于每次询问的点x,在x及x的子树中找出一个点,使删去这个点,所得包含元素最多的联通分块 所含有的点的个数 ...

  3. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  4. Codeforces Round #563 (Div. 2)/CF1174

    Codeforces Round #563 (Div. 2)/CF1174 CF1174A Ehab Fails to Be Thanos 其实就是要\(\sum\limits_{i=1}^n a_i ...

  5. 构造 Codeforces Round #302 (Div. 2) B Sea and Islands

    题目传送门 1 /* 2 题意:在n^n的海洋里是否有k块陆地 3 构造算法:按奇偶性来判断,k小于等于所有点数的一半,交叉输出L/S 4 输出完k个L后,之后全部输出S:) 5 5 10 的例子可以 ...

  6. Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...

  7. Codeforces Round #712 Div.2(A ~ F) 超高质量题解(每日训练 Day.15 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #712 Div.2(A ~ F) 题解 比赛链接:https:// ...

  8. Codeforces Round #701 (Div. 2) A ~ F ,6题全,超高质量良心题解【每日亿题】2021/2/13

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Add and Divide B - Replace and Keep Sorted C ...

  9. Codeforces Round #700 (Div. 2) D2 Painting the Array II(最通俗易懂的贪心策略讲解)看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 整场比赛的A ~ E 6题全,全部题目超高质量题解链接: Codeforces Round #700 ...

最新文章

  1. MAT入门到精通(二)
  2. 解决fitz模块报错
  3. 你随便动幕布,投影跟不上算我输,动态投影黑科技,AE特效秒变成真
  4. php 复制文件夹并压缩到最小_php在线压缩并下载压缩文件的方法
  5. ccls提示找不到文件
  6. Java基础班学习笔记(6)
  7. jeesite快速开发平台(三)----项目文件结构与配置文件详解
  8. 问题 | Android Studio:Missing contentDescription attribute on image(ImageView)
  9. TypeError: can‘t send non-None value to a just-started generator-python报错问题
  10. Bootstrap 字体图标Glyphicons
  11. sql 查询数据库索引重建_不良的数据库索引– SQL查询性能的杀手–建议
  12. 自定义cell的左侧滑动
  13. c语言字符串汇编,C语言调用汇编实现字符串对换
  14. Apizza在chrome上安装apizzaSQ扩展
  15. 时间序列-异常检测(Anomaly Detection)(四):深度学习方法
  16. ds18b20温度报警C语言程序,单片机中使用DS18B20温度传感器C语言程序(参考4)
  17. 计算机桌面有什么,电脑桌面是什么
  18. 【web视频资料百度云分享】
  19. 盘点 7 月份 yyds 的开源项目
  20. IC617 PDK CDB格式转OA格式

热门文章

  1. php百度人脸识别做登陆,php调用百度人脸识别接口查询数据库人脸信息实现验证登录功能...
  2. DOTA2:IG实力不如Nigma?解说:错了,让门票给他们自己回家训练
  3. 第六届蓝桥杯JavaC组省赛真题——详细答案对照(包含垒骰子)
  4. 如何快速截取某段时间内的日志
  5. oracle数据库中substring的使用方法
  6. linux覆盖和追加
  7. [考试反思]0819NOIP模拟测试26:荒芜
  8. 【BZOJ1452】[JSOI2009]Count(树状数组)
  9. 交换机基础设置之vtp管理vlan设置
  10. Xamarin.Android之封装个简单的网络请求类