题解:洛谷P14127 [SCCPC 2021] K-skip Permutation
这道题挺简单的。
题目大意
将n的全排列排成一个数列P1,P2,P3,⋯,Pn,使得满足1≤i<n,且Pi+k=Pi+1的i的数量最多。
思路
要使得Pi+k=Pi+1成立,需要满足Pi与Pi+1为公差为k的等差数列,也要使得Pimodk=Pi+1modk,而要使得这个等差数列长度尽可能长,需要同余k的所有数相邻且从小到大排序。
实现方法
枚举每个数除k的余数,并用vector存储,最后输出。
注意坑点
请注意,行末不能有多余的空格,否则你的答案可能会被判为错误!
AC代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
/*====================*/
const int N=1e6+10;
/*====================*/
const int INF=0x3f3f3f3f;
const int MOD=998244353;
/*====================*/
int n,k;
vector<int> a[N];
/*====================*/
void Solve(){cin>>n>>k;for(int i=1;i<=n;i++)a[i%k].push_back(i);int cnt=0;for(int i=0;i<k;i++){for(auto j:a[i]){++cnt;cout<<j;if(cnt!=n)cout<<" ";}}
}
/*====================*/
signed main(){//freopen(".in","r",stdin);//freopen(".out","w",stdout);ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int T=1;//cin>>T;while(T--){Solve();}return 0;
}
匆忙写的,代码很丑。
字数统计:1056 字符 | 上次保存时间 17:36:19
禁