题解 CF1719B

题解 CF1719B

这个题观察样例,可以发现,被选中的两个数,一定是相邻的两个数。

所以,我们只需要先循环一遍,看看有多少数满足,然后判断是否等于 n

如果等于说明可以 ,先输出 YES ,否则输出 NO

如果是 YES ,就直接再循环一遍,判断相邻的两个数,哪个是 \(+k\) 才能被 4 整除的,哪个是直接就可以 4 整除的。

先输出 \(+k\) 才能被 4 整除的。

然后输出直接就可以 4 整除的。

#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
#include<stack>
#include<map>
#include<queue>
//#define int long long
using namespace std;
int T;
queue<int> q_o,q_n;
int main(){
	scanf("%d",&T);
	while(T--){
		int n,k;
		scanf("%d%d",&n,&k);
		int f=0;
		for(int i=1;i<=n;i+=2){
			if((i+k)*(i+1)%4==0 || i*(i+1+k)%4==0){
				f+=2;
			}
		} 
		if(f==n){
			printf("YES\n");
			for(int i=1;i<=n;i+=2){
				if((i+k)*(i+1)%4==0 && i+1<=n){
					printf("%d %d\n",i,i+1); 
				}else if(i*(i+1+k)%4==0 && i+1<=n){
					printf("%d %d\n",i+1,i); 
				}
			}
		}else{
			printf("NO\n");
		}
		
	}
    return 0;
}
posted @ 2022-11-30 09:13  Tyrue  阅读(9)  评论(0编辑  收藏  举报