您的位置:首页 > 其它

Codeforces Round #359 (Div. 2) C. Robbers' watch (暴力DFS)

2016-08-01 00:48 501 查看
题目链接:http://codeforces.com/problemset/problem/686/C

给你n和m,问你有多少对(a, b) 满足0<=a <n 且 0 <=b < m 且a的7进制和n-1的7进制位数相同 且b的7进制和m-1的7进制位数相同,还有a和b的7进制上的每位上的数各不相同。

看懂题目,就很简单了,先判断a和b的7进制位数是否超过7,不超过的话就dfs暴力枚举计算就可以了。

//#pragma comment(linker, "/STACK:102400000, 102400000")
#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
#include <ctime>
#include <list>
#include <set>
#include <map>
using namespace std;
typedef long long LL;
typedef pair <int, int> P;
const int N = 1e5 + 5;
int num[10], n, m, ans;
bool vis[10];

int get(int num[], int len) {
int res = 0, temp = 1;
for(int i = len; i >= 1; --i) {
res += num[len] * temp;
temp *= 7;
}
return res;
}

void dfs(int len1, int len2, int dep) {
if(dep == len1 + len2) {
int sum = 0, temp = 1;
for(int i = len1+len2; i >= len1+1; --i) {
sum += temp*num[i];
temp *= 7;
}
if(sum < m)
ans++;
return ;
}
else if(dep == len1) {
int sum = 0, temp = 1;
for(int i = len1; i >= 1; --i) {
sum += temp*num[i];
temp *= 7;
}
if(sum >= n)
return ;
}
dep++;
for(int i = 0 ; i < 7 ; ++i) {
if(vis[i])
continue;
vis[i] = true;
num[dep] = i;
dfs(len1, len2, dep);
vis[i] = false;
}

}

int main()
{
cin >> n >> m;
int cnt1 = 0, cnt2 = 0, temp = n - 1;
do {
temp /= 7;
++cnt1;
} while(temp);
temp = m - 1;
do {
temp /= 7;
++cnt2;
} while(temp);
if (cnt1 + cnt2 > 7) {
cout << 0 << endl;
} else {
dfs(cnt1, cnt2, 0);
cout << ans << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: