【題解】Codeforces 686C. Robbers’ watch

【題目敘述】http://codeforces.com/problemset/problem/686/C

#include <bits/stdc++.h>
using namespace std;

int n, m, mid, l, used[7];
string s;

int f(int pos, bool lim){
    if (pos == s.length()) return 1;
    if (pos == s.length()-mid) lim = 1;
    int tmp = s[pos]-'0', ret = 0;
    if (lim){
        if (!used[tmp]){
            used[tmp] = 1;
            ret += f(pos+1, 1);
            used[tmp] = 0;
        }
        for (int i = 0; i < tmp; i++){
            if (used[i]) continue;
            used[i] = 1;
            ret += f(pos+1, 0);
            used[i] = 0;
        }
    }
    else{
        for (int i = 0; i < 7; i++){
            if (used[i]) continue;
            used[i] = 1;
            ret += f(pos+1, 0);
            used[i] = 0;
        }
    }
    return ret;
}

int main(){
    cin >> n >> m;
    n--;
    m--;
    if (m == 0) s = "0";
    while (m){
        s = (char)('0'+(m%7)) + s;
        m /= 7;
    }
    mid = s.length();
    if (n == 0) s = '0' + s;
    while (n){
        s = (char)('0'+(n%7)) + s;
        n /= 7;
    }
    //cout << "s: " << s << "\n";
    if (s.length() > 7){
        cout << 0 << "\n";
        return 0;
    }
    cout << f(0, 1);
}
分享本文 Share with friends