kmjp's blog

競技プログラミング参加記です

TopCoder SRM 653 Div2 Medium RockPaperScissorsMagicEasy

SRM653に参加。Easyに若干苦戦した上、Mediumが解けずれーと減少。
http://community.topcoder.com/stat?c=problem_statement&pm=13686

問題

ジャンケンで1回勝つと1ポイント得られ、あいこと負けはポイントを得られない。
N回分の相手のじゃんけんの手が与えられるとき、自分がKポイント得られるような手の出し方の組み合わせを答えよ。

解法

N回中K回勝つところを選ぶのが {}_N C_K通りで、勝たない(N-K)箇所はあいこか負けの2択なので、両者合わせて {}_N C_K \times 2^{N-K}を答えればよい。

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で出した制限ジャンケンを理解していると瞬殺だね。