题解:P15022 [UOI 2020 II Stage] 邻居

· · 题解

题意过于简单,这里不再累赘

思路

可以发现,对于一个单位格编号为 k 的单位格,当它的所处行和所处列相等,那么它一定在主对角线上,如果它的行数和列数加起来等于 n+1 那么一定在副对角线上。

AC code

#include<bits/stdc++.h>
using namespace std;
int n , k;
signed main(){
    cin >> n >> k;
    int h = (k - 1) % n + 1;
    int l = (k - 1) / n + 1;
    if(h == l){
        cout << "yes ";
    }else{
        cout << "no ";
    }
    if(h + l == n + 1){
        cout << "yes ";
    }else{
        cout << "no";
    }
    return 0;
}

当然,你可以用第二种方法AC本题。

思路

显而易见,如果这个格子在主对角线上那么格子单位格编号一定:

(n+1) \mid (k-1) \quad \land \quad 0 \le \frac{k-1}{n+1} < n.

如果在副对角线上一定:

k - n >= 0 \quad \land \quad (k - n) \mid (n - 1) \quad \land \quad \frac{k - n}{n - 1} < n

注:\mid 为整除而非或,\land 表示并且。

需注意,当 n=1 时会因为除于 0 而 RE,所以需要做个特判。

最后把式子搬进去判断一下即可。

AC code

#include<bits/stdc++.h>
using namespace std;
int n , k;
signed main(){
    cin >> n >> k;
    if(n == 1 && k == 1){
        cout << "yes yes ";
        return 0;
    } 
    if((k - 1) % (n + 1) == 0 && (k - 1) / (n + 1) < n){
        cout << "yes ";
    }else{
        cout << "no ";
    }
    if(k - n >= 0 && (k - n) % (n - 1) == 0 && (k - n) / (n - 1) <  n){
        cout << "yes ";
    }else{
        cout << "no ";
    }
    return 0;
}