题目大意
给定n,k,构造一个1-n的排列P,满足对于1-n中的每个i,P都存在一个长为i的子序列,并且每个子序列的和模n都余k。有解则输出任意P,无解输出-1。
思路
首先考虑判断解存在的问题。根据题意,因为P也是自己的子集,所以一定也应该满足“所有元素的和模n余k”的题设,也就是sum(1~n)%n==k,如果不满足,那自然无解。
假设k满足上述条件,接下来的命题就是判断k了。
这种看似要进行复杂的动态处理的问题大多都有规律,这题也不例外。多写两行数据会发现,当n为奇数时,sum(1~n)一定是n的整数倍,即k==0;n为偶数时,k==n/2。
根据这个写代码就好了。
#include <bits/stdc++.h>
using namespace std;
int n, k;
int main()
{
scanf( "%d%d", &n, &k );
if ( n % 2 )
{
if ( !k )
{
for ( int i = 1; i <= n / 2; i++ )
printf( "%d %d ", i, n - i );
printf( "%d", n );
}
else printf( "-1" );
}
else
{
if ( (n * (n + 1) / 2) % n == k )
{
for ( int i = 1; i < n / 2; i++ )
printf( "%d %d ", i, n - i );
printf( "%d %d", n / 2, n );
}
else printf( "-1" );
}
return 0;
}
这题赛时就是被吓到了,没找到规律。还是不能慌啊。