悩んだ。まだまだ実力が足らないみたい。
図に描いてみると分かるけど、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 件のコメント :
コメントを投稿