题目链接:https://ac.nowcoder.com/acm/contest/5671/E
题目大意:
给出n,k,问有没有一个1-n的排列,使得子串长度从1~n,总存在子串的和模n等于k。
解题思路:
1-n的和是(n+1)n/2能模n余k,则打表可知,奇数的时候k必须为0(别忘了为0的时候不输出k,因为是1—n的排列!),而偶数的时候k是n/2
肯定是把n放在最前面,k放在第二个,后面就是1,n-1,2,n-2...
如果n是奇数,P={n,k,1,n-1,2,n-2...}
如果n是偶数,P={n,k,1,n-1,2,n-2...}
*代码:**
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n, k;
scanf("%d%d",&n,&k);
int s = (1+n)*n/2;
if(s % n != k) {
cout << -1 << endl;
return 0;
}
if(n & 1)
{
if(k != 0) {
cout << -1 << endl;
}
else
{
cout << n <<" ";
for(int i = 1; i <= n/2; i++) {
cout << n-i << " " << i << " ";
}
cout << "\n";
}
}
else
{
if(k != n/2) {
cout << -1 << endl;
}
else
{
cout << n << " " << k << " ";
for(int i = 1; i < n/2; i++) {
cout << n-i << " " << i << " ";
}
cout << "\n";
}
}
}
京公网安备 11010502036488号