题解 CF1560B 【Who's Opposite?】
Chinshyo
2021-08-19 08:31:36
## 思路
我们可以通过 $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;
}
```