1. 程式人生 > 其它 >CF748A Santa Claus and a Place in a Class 題解

CF748A Santa Claus and a Place in a Class 題解

CF748A Santa Claus and a Place in a Class 題解

Content

聖誕老人坐在一個桌子被擺成 \(m\)\(n\) 列的教室裡。每個桌子有兩個座位,每個位置從左往右都有編號,依次為 \(1,2,3,...,2\times n\times m\)。已知聖誕老人坐在編號為 \(k\) 的位置,求:

  • 聖誕老人坐在第幾列第幾行。
  • 聖誕老人的座位是在桌子的左邊還是右邊。

資料範圍:\(1\leqslant n,m\leqslant 10000,1\leqslant k\leqslant 2\times 10^8\)\(2\times n\times m\) 的最大值)。

Solution

首先,我們可以求出聖誕老人在第幾列第幾行。

我們不妨把一個桌子看成一個集體,然後這樣編號:從第一列第一行開始,先從前往後,再從左往右,依次編號為 \(1,2,3,...,n\times m\)

。那麼,我們發現,聖誕老人此時的編號 \(s\) 就是 \(\left\lceil\dfrac{k}{2}\right\rceil\)。然後我們可以根據這個來求出列數和行數,分別是 \(\left\lceil\dfrac{s}{m}\right\rceil\)\(\begin{cases}m&m\mid s\\s\mod m&m\nmid s\end{cases}\)

至於在左在右的問題,那就更簡單了:如果 \(k\) 是奇數,那麼就應該坐在桌子的左邊,否則就應該坐在桌子的右邊。

Code

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <iostream>
using namespace std;

int n, m, k, mm, r, l;

int main() {
	scanf("%d%d%d", &n, &m, &k);
	mm = (int)ceil(k / 2.0);
	r = (int)ceil(mm * 1.0 / m), l = (mm % (m + 1) + 1);
	printf("%d %d %c", r, l, (k % 2 ? 'L' : 'R'));
}