1. 程式人生 > >Sicily 1431. Interesting Sequence(有趣的數列)

Sicily 1431. Interesting Sequence(有趣的數列)

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;
}