Posted at

ABC091 C - Flip,Flip, and Flip...... (300点)


問題概要

問題のリンク

$N$ 行 $M$ 列のマス目が与えられる。全てのマスの上にはカードが表になって敷き詰められている。

以下の操作を全てのマスについて一回ずつ繰り返す。

「そのマスと辺または点で接する $8$ つのマスと、そのマスの合計 $9$ マスについて、カードが存在するなら裏返す。」

全ての操作を行った後、裏になっているマスの数はいくつか。


制約条件


  • $1$≤$N,M$≤$10^9$

  • 入力は全て整数である


考えたこと

実験してみればわかるが、操作が奇数回行われれば、ウラになり、偶数回であればオモテになる。

よってそれぞれのマスについて操作が何回行われるか考えればよい。

自分含めて接しているマスの数と同じぶん処理が行われるので、四隅は4回、辺のマスは6回、それ以外のマスは9回処理が行われる。

(実験してみると以下のようなかんじ)

IMG_1311.JPG

よって、四隅と辺のマスを重複なく数え上げて、元のマスの数との差をとればよい。

「行または列が1」と「行と列が1」のコーナーケースがあることと桁溢れに注意して書けばACである。


解答


c.cs

using System;

using System.Linq;

class Program
{
static void Main(string[] args) {
long[] s = Console.ReadLine().Split().Select(long.Parse).ToArray();
Console.WriteLine(solve(s[0], s[1]));
}
static long solve(long n, long m) {
long count = 0;
if(n==1 && m==1) count = 1;
else if(n == 1 || m == 1) count = n * m - 2;
else count = n*m - (2*(m+n)-4);
return count;
}
}