1. 程式人生 > >3641. 整數劃分(構造)

3641. 整數劃分(構造)

試將 1 到 n 這 n 個正整數分成三份,使得這三份的和相等。

Input

輸入一個正整數 n (1≤n≤2⋅105)。

Output

輸出 n 個正整數 k1,k2,…,kn (1≤ki≤3),用空格隔開。ki 表示要把 i 這個整數分在第幾組。

如果有多解輸出任意一解。如果無解輸出 Impossible

Examples

input

6

output

3 2 1 1 2 3

input

5

output

1 2 2 1 3

input

7

output

Impossible

題目大概:

1到n這n個整數,問能否分成相等三部分,如果能,那麼就輸出它輸入那個集合。

思路:

構造題,可以看出六個連續的數可以構成一組,能組成相等的三個整數。

然後手動構造出小樣例,大樣例都是小樣例加多個6.

程式碼:

#include <bits/stdc++.h>

using namespace std;
#define ll long long
const int maxn=2e5+100;
int vis[maxn];

int main()
{
    int n;
    scanf("%d",&n);
    if(n==2||n==3||n%3==1)
    {
        printf("Impossible\n");
        return 0;
    }
    int st;
    if((n-5)%6==0)
    {
        vis[1]=vis[4]=1;
        vis[2]=vis[3]=2;
        vis[5]=3;
        st=6;
        for(int i=st; i<=n; i=i+6)
        {
            vis[i]=1;
            vis[i+1]=2;
            vis[i+2]=3;
            vis[i+3]=3;
            vis[i+4]=2;
            vis[i+5]=1;
        }
    }
    if((n-6)%6==0)
    {
        vis[1]=vis[6]=1;
        vis[2]=vis[5]=2;
        vis[3]=vis[4]=3;
        st=7;
        for(int i=st; i<=n; i=i+6)
        {
            vis[i]=1;
            vis[i+1]=2;
            vis[i+2]=3;
            vis[i+3]=3;
            vis[i+4]=2;
            vis[i+5]=1;
        }
    }
    if((n-8)%6==0)
    {
        vis[1]=vis[2]=vis[3]=vis[6]=1;
        vis[4]=vis[8]=2;
        vis[5]=vis[7]=3;
        st=9;
        for(int i=st; i<=n; i=i+6)
        {
            vis[i]=1;
            vis[i+1]=2;
            vis[i+2]=3;
            vis[i+3]=3;
            vis[i+4]=2;
            vis[i+5]=1;
        }
    }
    if((n-9)%6==0)
    {
        vis[1]=vis[2]=vis[3]=vis[4]=vis[5]=1;
        vis[6]=vis[9]=2;
        vis[7]=vis[8]=3;
        st=10;
        for(int i=st; i<=n; i=i+6)
        {
            vis[i]=1;
            vis[i+1]=2;
            vis[i+2]=3;
            vis[i+3]=3;
            vis[i+4]=2;
            vis[i+5]=1;
        }
    }
    for(int i=1; i<=n; i++)
    {
        printf("%d ",vis[i]);
    }
    return 0;
}