はまやんはまやんはまやん

hamayanhamayan's blog

fLIP [CODE FESTIVAL 2017 予選A B]

http://code-festival-2017-quala.contest.atcoder.jp/tasks/code_festival_2017_quala_b

解説

http://code-festival-2017-quala.contest.atcoder.jp/submissions/1619716

横で反転させる個数を全探索する。
i行反転させたとすると、1列反転させることで、(N-i)増え、iだけ減る。
そのため、変化量dは(N - 1)-iであり、必要な黒マスの個数と増加量から後何回縦で反転させればいいかを見つける。
ピッタリにできるならYes

int N, M, K;
//--------------------------------------------------------------------------------------------------
void _main() {
    cin >> N >> M >> K;
    
    rep(i, 0, N + 1) {
        int painted = i * M;
 
        int d = (N - i) - i;
 
        // painted + d * n = K
        // d * n = K - painted
 
        if (d == 0 && (K - painted) == 0) {
            printf("Yes\n");
            return;
        }
 
        if(d) if (0 <= K - painted) if ((K - painted) % d == 0) {
            int n = (K - painted) / d;
            if (0 <= n && n <= M) {
                printf("Yes\n");
                return;
            }
        }
    }
 
    printf("No\n");
}