题意简述:
对于给定的 $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; }
总结:
一道简单的数论题 , 可以从样例得出解法 , 需要略加思考.
标签:Mathematical,typedef,Circus,long,分组,CF1719B,equiv,include,mod From: https://www.cnblogs.com/Lib-Zhang/p/16595034.html