解いた問題

7/14/2011

SRM457 Div1 Medium

500
悩んだ。まだまだ実力が足らないみたい。
図に描いてみると分かるけど、1度に使う色の組は意外と少ない。
どの色にどの数を使うかの組み合わせを計算する。
lli fact(lli n)
{
  lli m = 1;
  for(lli i=1; i<=n; ++i){
    m *= i;
  }
  return m;
}

lli calc(string c, lli n)
{
  lli sum = 0;
  sort( c.begin(), c.end() );
  do{
    bool flg = true;
    for(int i=0; i<6; ++i){
      if( c[i] == c[6] )flg = false;
      if( c[i] == c[(i + 1) % 6] )flg = false;
    }
    sum += flg;
  }while( next_permutation( c.begin(), c.end() ) );

  map<char, int> cnt;
  for(int i=0; i<c.size(); ++i){
    ++cnt[ c[i] ];
  }

  int one, two;
  one = two = 0;
  for(int i=0; i<c.size(); ++i){
    if( cnt[ c[i] ] == 1 ) ++one;
    if( cnt[ c[i] ] == 2 ) ++two;
  }
  two /= 2;

  sum /= fact( one );
  sum /= fact( two );
  for(int i=0; i<one+two; ++i){
    sum *= n - i;
  }
  return sum * (1LL << (one + two)) / 6LL;
}

class TheHexagonsDivOne {
public:
  long long count(int n) {

    lli sum = 0;
    if(7 <= n) sum += calc("ABCDEFG", n);
    if(6 <= n) sum += calc("AABCDEF", n);
    if(5 <= n) sum += calc("AABBCDE", n);
    if(4 <= n) sum += calc("AABBCCD", n);

    return sum;
  }
};

0 件のコメント :

コメントを投稿