wizard(偷开O2
2023-08-14 22:51:02
一道非常好的数论题
有一个有
已知环内所有元素的权值都小于
进而我们就知道了
先构造一个答案序列,先前环中标号为
也就是说让
直接推出原序列。
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=3e5+10;
signed main(){
int T;
cin >> T;
while(T--){
int n,k;
cin >> n >> k;
int vis[maxn];
vector <int> vec;
for(int i=0;i<=n+1;i++){
vis[i]=0;
}
if(k>(n/2)){
cout << "No" << endl;
continue;
}else{
cout << "Yes" << endl;
}
for(int i=1;i<=k;i++){
int ans=i;
if(vis[i]!=1){
while(1){
vec.push_back(ans);
vis[ans]=1;
ans=ans*2;
if(ans>k){
break;
}
}
vec.push_back(ans);
vis[ans]=1;
}
}
for(int i=k+1;i<=n;i++){
if(!vis[i]){
vec.push_back(i);
}
}
for(int i=0;i<vec.size();i++){
cout << vec[i] << " ";
}
cout << endl;
}
return 0;
}
因为 memset
,复杂度会达到