题解 CF1560B 【Who's Opposite?】

Chinshyo

2021-08-19 08:31:36

Solution

## 思路 我们可以通过 $a$ 和 $b$ 或任意两个相对面人的编号求出圈内的人的个数。 我们可以试着画图找规律。 ![](https://cdn.luogu.com.cn/upload/image_hosting/kkryhknr.png) 从图中可发现: - $i$ 和 $j$ 上面的数字个数为 $j-i+1$ ,而由于他们两两看着对方, $i$ 和 $j$ 下面的数字个数也为 $j-i+1$ 。因此圈内人数 $n$ 为 $2 + 2(b - a - 1)$ 。 - 每两个相互对视的人编号差为 $\dfrac{n}{2}$ 。 因此我们只需知道 $c$ ,解就是 $(c+\dfrac{n}{2})\mod n $ 。但如果计算得 0 ,则输出 $n$ 。 对于 $a$ ,$b$ 和 $c$ , 如果其中任何一个不在 $n$ 的范围内,就无解,输出 `-1` 。这一结论亦通过找规律可得。 ## 代码 ```cpp #include<bits/stdc++.h> #define debug cout << "Helloworld" << endl using namespace std; int main() { int n; cin >> n; for(int i = 1; i <= n; i++) { int a, b, c; cin >> a >> b >> c; if(b < a) swap(a, b); //维持 b > a int n = 2 + (b - a - 1) * 2; if(n < max(a, max(b, c))) cout << -1 << endl; else if((c + n / 2) % n == 0) cout << n << endl; else cout << (c + n / 2) % n << endl; } return 0; } ```