CF2155C
2025-10-06 04:07:52
发布于:广东
神人诈骗题。
假设第 个巫师面向的方向为 ,则根据题意可以列出如下方程:
情况数就是解的数量。
注意到解的数量不超过 ,所以那个对 取模毛用没有。
注意到当 时,方程有两个解,其余时候最多只有一个解。
我们可以特判掉两个解的情况。
然后考虑如何解这个方程。
注意到 式与 式差别就在于 与 ,然后因为 的范围可得出 的差的绝对值应不超过 ,而且 相等时,,否则 。
同理,也可以推出 与 的关系。
然后注意了,需要验证这些解成不成立!
我们分别假设 ,判断等式成不成立即可。如果其中一个成立,则说明有一个解,否则说明没有解。
// 哇还有解方程环节
// 666解不出来
// a_i一定是连续的
#include <iostream>
#include <cstdio>
#define int long long
using namespace std;
const int mod = 676767677;
int a[100005];
int b[100005];
int pre[100005];
int n;
bool check(){
for(int i = 1; i <= n; i++) pre[i] = 0;
for(int i = 1; i <= n; i++){
pre[i] = pre[i - 1] + b[i];
}
for(int i = 1; i <= n; i++){
if(pre[n] - pre[i] + i - pre[i - 1] != a[i]) return 0;
}
return 1;
}
void solve(){
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
bool flag = 1;
if(n % 2 == 0) flag = 0;
for(int i = 1; i <= n; i++){
if(i > 1 && abs(a[i] - a[i - 1]) > 1){
cout << "0\n";
return;
}
if(a[i] != n / 2 + 1) flag = 0;
}
if(flag){
cout << "2\n";
return;
}
for(int i = 2; i <= n; i++){
if(abs(a[i] - a[i - 1]) == 1){
b[i] = b[i - 1];
}else b[i] = b[i - 1] ^ 1;
}
if(check()){
cout << "1\n";
for(int i = 1; i <= n; i++){
b[i] = 0;
}
return;
}
for(int i = 1; i <= n; i++){
b[i] ^= 1;
}
if(check()){
cout << "1\n";
for(int i = 1; i <= n; i++){
b[i] = 0;
}
return;
}
cout << "0\n";
for(int i = 1; i <= n; i++){
b[i] = 0;
}
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
int t;
cin >> t;
while(t--) solve();
return 0;
}
时间复杂度:。
全部评论 3
d
2025-10-06 来自 上海
0C题数据
2025-10-06 来自 广东
0d
2025-10-06 来自 广东
0




















有帮助,赞一个