CF1719B Mathematical Circus
题意简述:
对于给定的 $n,k$ , 能否将 $1,2,3,...,n$ ( $n$ 为偶数),两两分组.
求对于每个分组 ( $x_i$ , $y_i$ ) , 是否全部满足 $4 \mid (x_i+k)*y_i $ , 如果分组全部满足输出 $YES$ ,如果有一分组不符合输出 $NO$ .
分析:
如果 $k \equiv 1 \mod 2 $ , 那么总有一种合法情况为 $x_i$ 全部为奇数 , $y_i$ 全部为偶数.
如果 $k \equiv 0 \mod 4$ , 说明每个奇数只能与 $4$ 的倍数配对,而奇数有 $\frac{n}{2}$ 个 , $4$ 的倍数小于 $\frac{n}{4}$ 个 . 所以该情况无解
对于剩下的情况 (即 $k \equiv 0 \mod 2$ 且 $k \equiv 2 \mod 4$)
从 $3$ 开始正序输出两个数 , 接着间隔 $3$ 个数 , 重复执行.
再从 $2$ 开始倒序输出两个数 , 接着间隔 $4$ 个数 , 重复执行.
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<set>
#include<stack>
#include<map>
#include<queue>
#include<cstdlib>
#include<iomanip>
#include<utility>
#define mid (l+r>>1)
#define endl '\n'
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pai;
const double eps = 1e-10;
const int base = 13331;
const long long mod = 998242353;
long long maxn = -2147483647-1,minn = 0x7f7f7f7f;
ll t,n,k;
int main(){
//freopen("filename.in","r",stdin);
//freopen("filename.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>t;
while(t--){
cin>>n>>k;
if(k%4==0){
cout<<"NO"<<endl;
continue;
}
if(k%2==1){
cout<<"YES"<<endl;
for(int i=1;i<=n;++i){
cout<<i<<" ";
if(!(i%2)){
cout<<endl;
}
}
}
else{
cout<<"YES"<<endl;
for(int i=3;i<=n;i+=4){
cout<<i<<" "<<i+1<<endl;
}
for(int i=2;i<=n;i+=4){
cout<<i<<" "<<i-1<<endl;
}
}
}
//fclose(stdin);
//fclose(stdout);
return 0;
}
总结:
一道简单的数论题 , 可以从样例得出解法 , 需要略加思考.

浙公网安备 33010602011771号