本日解いたCodeforcesの問題の原文はこちらで確認することができる。問題を大まかに説明する。入出力サンプルは原文を参照してほしい。
Berlandの首都の劇場広場はnメートル*mメートルの長方形の形状をしている。街の記念日の機会に、広場に正方形の御影石でできた敷石を詰めるということが決まった。敷石はすべてaメートル*aメートルのサイズである。nメートル*mメートルの領域を埋めるのに必要な敷石は最低でいくつになるか?領域をカバーするに当たり、敷石を壊して埋めることは認められないし、敷石は領域の辺に平行になるように並べなければならないものとする。
私の解答はこちら。
#include <stdio.h> #include <iostream> using namespace std; long long int nFlagstones(long long int s[], long long int a){ int mMod = s[0] % a == 0 ? 0 : 1; int nMod = s[1] % a == 0 ? 0 : 1; return (s[0]/a+mMod)*(s[1]/a+nMod); } int main(void){ long long int size[2]; long long int alpha = 0; cin >> size[0] >> size[1] >> alpha; cout << nFlagstones(size, alpha); return 0; }
C言語で%lldで入出力しようとしたら、それはダメとシステムに苦情を言われ、やむなくC++でコーディング。TopCoderと違って言語が広く選択できる反面、入出力のコードを書かないといけないので、大変面倒と思いました。問題のポイントはlong long intのサイズまで利用しないとダメになるということでしょうか。入出力の仕様上、最大で必要な枚数は10^18まで大きくなるので、その数字が扱えるよう大きめの型にする必要があります。その他、敷き詰める枚数は切り上げになるということのロジックに気を付けるぐらいでしょう。問題自体は簡単ですが、型に気を使わないといけないというのはTopcoderではあまりなく、斬新に思いました。