(基数変換)CF-359-C-Robbers’ watch

問題URL→http://codeforces.com/contest/686/problem/C

7進数で各桁が全て異なる場合を考えれば良いので7!通り試せばいい。
基数変換はこんなにすっきり書けるようだ。

#include <bits/stdc++.h>
#define FOR(i,bg,ed) for(ll i=(bg);i<(ed);i++)
#define REP(i,n) FOR(i,0,n)
#define REP1(i,n) for(ll i=1;i<=(n);i++)
#define MOD 1000000007
#define int long long
#define all(c) (c).begin(), (c).end()
#define uniq(c) c.erase(unique(all(c)), (c).end())
using namespace std;
typedef long long ll;
typedef pair<ll, ll> P;
typedef vector<int> vec;
typedef vector<vec> mat;
const int INF = 1e9;
const ll LLINF = LLONG_MAX / 10;

int n, m;

signed main()
{
    cin >> n >> m;

    //↓これでn,mの7進数の桁数が分かる
    int len1 = 1, len2 = 1;
    for (int a=7; a<n; a*=7) len1++;
    for (int b=7; b<m; b*=7) len2++;

    int ans = 0;
    if (len1 + len2 <= 7) {
        for (int i=0; i<n; i++) {       //時間
            for (int j=0; j<m; j++) {   //分
                vector<int> used(7, 0);
                //↓これで7進数表示の各桁を処理できる
                for (int a=i, k=0; k!=len1; a/=7, k++) {
                    used[a % 7] += 1;
                }
                for (int b=j, k=0; k!=len2; b/=7, k++) {
                    used[b % 7] += 1;
                }
                if (*max_element(used.begin(), used.end()) <= 1) {
                    ans++;
                }
            }
        }
    }

    cout << ans << endl;
}

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です