1431. Interesting Sequence(有趣的数列)
Constraints
Time Limit: 1 secs, Memory Limit: 32 MB , Special Judge
Description
Philia这个孩子真是聪明绝顶,在其他伙伴只知道把一列数逐个加起来的和会越来越大的时候,她就知道了其实这个和也会变小的。因为她已经学会了负数啦!爱思考的Philia给自己提出了一个很有趣的问题:是否存在一个长度为n的整数数列,其任意连续p项之和为正数而任意连续q项之和为负数?Philia思考了一下,发现原来不是那么简单咧,于是她请教你,世界上最聪明的程序员。你思考了片刻,大悟:这不很简单吗?看我写个程序来搞定它!
Input
标准输入,输入数据第一行包含一个整数T,表示输入有T组数据,下面每行一组数据,由三个整数数n, p, q 描述,各数据意义如上述,其中1<=n<=1000000, 1<=p, q<=n.
Output
结果输出到标准设备。对应于每组输入数据,相应结果在同一行输出。如果这样的数列存在,则输出这个数列,要求每一项的绝对值小于10^9, 相邻两项间用一个空格隔开,行首行末无多余空格。如果有多个解,只要输出任意一个即可。如果这样的序列不存在,则输出”Impossible”.
Sample Input
2 6 5 3 4 2 4
Sample Output
-8 18 -12 -8 16 -11 Impossible
Problem Source
<Good Luck, Sysu Teams>,crystal
// Problem#: 1431
// Submission#: 3238446
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include <stdio.h>
#include <queue>
using namespace std;
//sort记录s[i]的大小,
//sort[i]>sort[j]=>s[i]>s[j],
//sort[i]-sort[0]=s[i]-s[0]=s[i],
//a[i]=sort[i]-sort[i-1]。
int sort[1000001];
int main(){
int t,n,p,q,m,i,j;
queue<int> mq;
scanf("%d",&t);
while(t--){
scanf("%d %d %d",&n,&p,&q);
if(p+q<n+2){
printf("Impossible\n");
continue;
}
m=n;
for(i=n-p+1;i<=q-1;i++)
mq.push(i);
while(!mq.empty()){ //拓扑排序
i=mq.front();
mq.pop();
sort[i]=m--;
if(i-p>=0)
mq.push(i-p);
else if(i+q<=n)
mq.push(i+q);
}
if(m==-1){
for(i=1;i<=n-1;i++)
printf("%d ",sort[i]-sort[i-1]);
printf("%d\n",sort[n]-sort[n-1]);
}
else
printf("Impossible\n");
}
return 0;
}