2022 ICPC 济南 E Identical Parity (扩欧)

2022 ICPC 济南 E. Identical Parity (扩欧)

Problem - E - Codeforces

大意:给出一个 n 和一个 k , 问是否能构造一个长 n 的排列使得所有长 k 的连续子序列和的奇偶性相同。

思路:通过分析可知 , 任两个间隔 k - 1 的元素奇偶性必然相同 , 这样的话 , 问题就转化成了

( n % k )个( ⌊ n k ⌋ + 1 )和( k − n % k )个( ⌊ n k ⌋ )是否能组成( ⌊ n 2 ⌋ )和( n − ⌊ n 2 ⌋ )的问题 (n ~\% ~k ~)个(\left \lfloor \frac{n}{k} \right \rfloor +1)和(k-n~\%~k)个(\left \lfloor \frac{n}{k} \right \rfloor)是否能组成(\left \lfloor \frac{n}{2} \right \rfloor)和(n - \left \lfloor \frac{n}{2} \right \rfloor)的问题 (n % k )个(⌊kn⌋+1)和(k−n % k)个(⌊kn⌋)是否能组成(⌊2n⌋)和(n−⌊2n⌋)的问题

很自然的就可以想到 01 背包去解决这个问题 , 但是显然 n 和 k 的范围太大了 , 无法使用 01 背包去解决这个问题。 于是转化问题 , 考虑现有范围的 x 和 y 是否能满足以下式子。

( ⌊ n k ⌋ + 1 ) ∗ x + ( ⌊ n k ⌋ ) ∗ y = ( ⌊ n 2 ⌋ ) (\left \lfloor \frac{n}{k} \right \rfloor +1)*x~+~(\left \lfloor \frac{n}{k} \right \rfloor)*y = (\left \lfloor \frac{n}{2} \right \rfloor) (⌊kn⌋+1)∗x + (⌊kn⌋)∗y=(⌊2n⌋)

带入扩欧得到通解:

x = x 0 ∗ c g c d ( a , b ) + k ∗ b g c d ( a , b ) x=x_0*{c\over gcd(a,b)}+{k*b\over gcd(a,b)} x=x0∗gcd(a,b)c+gcd(a,b)k∗b

y = y 0 ∗ c g c d ( a , b ) − k ∗ a g c d ( a , b ) y=y_0*{c\over gcd(a,b)}-{k*a\over gcd(a,b)} y=y0∗gcd(a,b)c−gcd(a,b)k∗a

根据已有的 x 的范围 和 y 的范围分别求出两个 k 的范围 , 判断这两个区间是否相交即可。

易错点:是否可以通过 x 的范围求出对应 k 的范围然后带入求 y 的范围 ?显然是可以的 , 但是这样求出的 y 的范围区间是不连续的 , 也就不能判交。

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define int long long
const int N = 2e6 + 10;
const int mod = 1e9 + 7;
typedef pair<int,int>PII;

int n , t , k;

int exgcd(int a , int b , int &x , int &y){
	
	if(b == 0){ x = 1; y = 0; return a;}
	int g = exgcd(b , a % b , y , x);
	y -= a / b * x;
	return g;
}

signed main(){

	IOS
	cin >> t;
	
	while(t --){
		cin >> n >> k;
		
		if(n % k == 0){
			int num = n / k , od , ev;
		    ev = n / 2;
		    od = n - ev;
			if(ev % num == 0 && od % num == 0){
				cout << "Yes" << "\n";
			}else{
				cout << "No" << "\n";
			}
		}else{
			int a = n / k , b = n / k + 1 , c = n / 2;
			int cntb = n % k , cnta = k - n % k;

			int x , y , gcds;
			gcds = exgcd(a , b , x , y);
			a /= gcds;b /= gcds;c /= gcds;
			
			int k1_max = floor((double)(cnta - x * c) / (double) b);
			int k1_min = ceil((double)(0 - x * c) / (double) b);
			int k2_max = floor((double)(y * c) / (double) a);
			int k2_min = ceil((double)(y * c - cntb) / (double) a);  
			
			if(k1_min > k1_max || k2_min > k2_max){
				cout << "No\n";
			}else{
				if(min(k2_max , k1_max) >= max(k1_min , k2_min)){
					cout << "Yes\n";
				}else{
					cout << "No\n";
				}
			}
		}
		
	}

	return 0;
}
//freopen("文件名.in","r",stdin);
//freopen("文件名.out","w",stdout);
相关推荐
长安——归故李20 分钟前
【modbus学习】
java·c语言·c++·学习·算法·c#
兴科Sinco1 小时前
[leetcode 1]给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数[力扣]
python·算法·leetcode
沐怡旸1 小时前
【算法--链表】138.随机链表的复制--通俗讲解
算法·面试
anlogic1 小时前
Java基础 9.10
java·开发语言·算法
薛定谔的算法1 小时前
JavaScript单链表实现详解:从基础到实践
数据结构·算法·leetcode
CoovallyAIHub1 小时前
CostFilter-AD:用“匹配代价过滤”刷新工业质检异常检测新高度! (附论文和源码)
深度学习·算法·计算机视觉
幻奏岚音1 小时前
《数据库系统概论》第一章 初识数据库
数据库·算法·oracle
你好,我叫C小白1 小时前
贪心算法(最优装载问题)
算法·贪心算法·最优装载问题
CoovallyAIHub1 小时前
CVPR 2025 | 频率动态卷积(FDConv):以固定参数预算实现频率域自适应,显著提升视觉任务性能
深度学习·算法·计算机视觉
mit6.8241 小时前
[rStar] 解决方案节点 | `BaseNode` | `MCTSNode`
人工智能·python·算法