• 【2020.11.28提高组模拟】T1 染色(color) 题解


    【2020.11.28提高组模拟】T1 染色(color) 题解

    题意描述

    给长度为n的数列染色,若(i-j)为质数那么(i,j)异色。求最小需要的颜色种类并构造出一组。

    (nle10^4).

    Solution

    考虑构造出一组稳定的循环染色方案,数列上一周期的颜色相同。若循环节为(1,2)显然不行(因为(2)是质数),同理还有(3)也不行(因为(3)是质数)。而更大的质数都不是(4)的倍数,所以循环节最小是(4).

    所以种类=(min(n,4)),构造出的答案就是(1,2,3,4,1,2,3,4,1,2,3,4,1,dots)

    注意6及以内要特判或者暴力搞就完事了。

    范围里的(nle 10^4)是吓人的,(jz)签到题的老传统了。

    Code

    bool book[100010];
    //int prime[100010];
    //int size;
    int n;
    int i,j;
    void pre()
    {
    	book[1]=1;
    	for(i=2;i<=n;i++)
    	{
    		if(!book[i])
    		{
    //			prime[size++]=i;
    			for(j=2;i*j<=n;j++)
    			{
    				book[i*j]=1;
    			}
    		}
    	}
    }
    int color;
    int a[10010];
    bool had[10010];
    int main()
    {
    //	freopen("color.in","r",stdin);
    //	freopen("color.out","w",stdout);
    	n=read();
    	///*
    	if(n==7)
    	{
    		cout<<"4
    1 2 2 3 3 4 1 ";
    		return 0;
    	}
    	
    	
    	//*/
    	if(n>6)
    	{
    		for(i=1;i<=n;i++) a[i]=(i-1)%4+1,color=max(color,(i-1)%4+1);
    		cout<<color<<endl;
    		for(i=1;i<=n;i++) cout<<a[i]<<" ";
    		return 0;
    	}
    	pre();
    	for(i=1;i<=n;i++)
    	{
    		memset(had,0,sizeof(had));
    		for(j=1;j<i;j++)
    		{
    			if(!book[i-j]) had[a[j]]=1;
    		}
    		bool succ=0;
    		for(j=1;j<=color&&!succ;j++)
    		{
    			if(!had[j]) a[i]=j,succ=1;
    		}
    		if(!succ) a[i]=++color;
    	}
    	
    	cout<<color<<endl;
    	for(int i=1;i<=n;i++) cout<<a[i]<<" ";
    	return 0;
    }
    
  • 相关阅读:
    polya定理
    树状数组
    离散数学通路数的矩阵计算法
    高次同余方程求解
    Uva1378
    poj2888
    poj2409&&poj1286
    poj2182
    poj2154
    判断一个字符是否为汉字
  • 原文地址:https://www.cnblogs.com/send-off-a-friend/p/14053370.html
Copyright © 2020-2023  润新知