SRM653に参加。Easyに若干苦戦した上、Mediumが解けずれーと減少。
http://community.topcoder.com/stat?c=problem_statement&pm=13686
問題
ジャンケンで1回勝つと1ポイント得られ、あいこと負けはポイントを得られない。
N回分の相手のじゃんけんの手が与えられるとき、自分がKポイント得られるような手の出し方の組み合わせを答えよ。
解法
N回中K回勝つところを選ぶのが通りで、勝たない(N-K)箇所はあいこか負けの2択なので、両者合わせてを答えればよい。
const int CN=2201; ll C[CN][CN]; ll mo=1000000007; class RockPaperScissorsMagicEasy { public: int count(vector <int> card, int score) { int i,j; FOR(i,CN) for(j=0;j<=i;j++) C[i][j]=(j==0||j==i)?1:(C[i-1][j-1]+C[i-1][j])%mo; if(score>card.size()) return 0; ll ret=C[card.size()][score]; FOR(i,card.size()-score) ret=ret*2%mo; return ret; } }
まとめ
自分がyukicoderで出した制限ジャンケンを理解していると瞬殺だね。