2022 ICPC 济南站 E - Identical Parity // exgcd
题目来源:2022 International Collegiate Programming Contest, Jinan Site E
题目链接:https://codeforces.com/gym/104076/problem/E
题意
有
给定整数
数据范围:
思路:exgcd
可以视作有一个长度为
于是整个排列可以按照
我们需要解决的问题实际上就是,找到一组整数解
对于这个等式,可以用 exgcd 求得一组解
时间复杂度:
代码
#include <bits/stdc++.h>
#define int long long
using namespace std;
int exgcd(int a, int b, int& x, int& y)
{
if(!b) {
x = 1, y = 0;
return a;
}
int d = exgcd(b, a % b, x, y);
int tmp = x;
x = y, y = tmp - a / b * y;
return d;
}
void solve()
{
int n, k;
cin >> n >> k;
int a = n / k, p = k - n % k;
int b = n / k + 1, q = n % k;
int x, y;
int d = exgcd(a, b, x, y);
if(n / 2 % d) {
cout << "No" << '\n';
return;
}
x = x / d * (n / 2), y = y / d * (n / 2);
int l = -1e9, r = 1e9;
int l1 = r;
while(l <= r) {
int mid = l + r >> 1;
if(x + mid * (b / d) >= 0) r = mid - 1, l1 = mid;
else l = mid + 1;
}
l = -1e9, r = 1e9;
int r1 = l;
while(l <= r) {
int mid = l + r >> 1;
if(x + mid * (b / d) <= p) l = mid + 1, r1 = mid;
else r = mid - 1;
}
l = -1e9, r = 1e9;
int l2 = r;
while(l <= r) {
int mid = l + r >> 1;
if(y - mid * (a / d) <= q) r = mid - 1, l2 = mid;
else l = mid + 1;
}
l = -1e9, r = 1e9;
int r2 = l;
while(l <= r) {
int mid = l + r >> 1;
if(y - mid * (a / d) >= 0) l = mid + 1, r2 = mid;
else r = mid - 1;
}
cout << (max(l1, l2) <= min(r1, r2) ? "Yes" : "No") << '\n';
}
signed main()
{
cin.tie(0);
ios::sync_with_stdio(false);
int test;
cin >> test;
while(test--) solve();
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】