链接:https://ac.nowcoder.com/acm/contest/1842/F
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
小a在研究自然数的染色问题时,发现了一个有趣的问题。
一个由正整数构成的集合S,若满足:对全体正整数集作k色染色后,S中不存在一个元素x,使得x是两个同色的不同正整数的和,则S是合法的(即 给全体正整数分别赋一个1∼k1\sim k1∼k的权值,若S合法,且存在a+b=x, a≠b, x∈Sa+b=x,\ a\neq b,\ x\in Sa+b=x, a=b, x∈S,则a,b的权值必须不同)。
给定k,求最大的正整数n,满足对任意的非负整数a,存在至少一种方案,使得用k种颜色染色后,集合S={a+1,a+2,…,a+n}S=\{a+1,a+2,\ldots,a+n\}S={a+1,a+2,…,a+n}是合法的(若n=0,则S为空集,空集是一定合法的)。
如当k=2, a=2, n=2k=2,\ a=2,\ n=2k=2, a=2, n=2时:集合S={a+1,a+2}={3,4}是合法的。
用1,2表示两种颜色,一种合法的染色方案为:1∼41\sim 41∼4的颜色分别是:1 2 2 11\ 2\ 2\ 11 2 2 1。
而当k=2, a=2, n=3k=2,\ a=2,\ n=3k=2, a=2, n=3时:不存在一种染色方案,使得集合S={a+1,a+2,a+3}={3,4,5}是合法的。
当k=3, a=3, n=3k=3,\ a=3,\ n=3k=3, a=3, n=3时:集合S={a+1,a+2,a+3}={4,5,6}是合法的。
用1,2,3表示三种颜色,一种合法的染色方案为:1∼61\sim 61∼6的颜色分别是:1 1 2 3 2 11\ 1\ 2\ 3\ 2\ 11 1 2 3 2 1(4=1+3, 5=1+4=2+3, 6=1+5=2+44=1+3,\ 5=1+4=2+3,\ 6=1+5=2+44=1+3, 5=1+4=2+3, 6=1+5=2+4,加号的两边的数互不同色)。
(仅用做举例说明S是合法的,不代表此时的n一定是最大的。)
输入描述:
第一行一个非负整数k,含义如题目所示。
输出描述:
输出一个整数,表示询问的结果(最大的合法的n)。
示例1
输入
复制
2
输出
复制
2
备注:
k≤105k\leq10^5k≤105。
题意:
用k种颜色给所有自然数染色,问集合S的最大元素个数使得S满足:以S内任意一个元素为和拆成的两个不同自然数的颜色不同。
思路:
假设有k种颜色,对任意一个自然数n,我们对n,n+1,n+2,n+3……n+k-1分别染上了第1种、第2种、第3种……第k种颜色,那么他们之间任意两个数的和肯定可以当作S的一个元素,所以现在S中的元素有2*n+1,2*n+2,2*n+3……2*n+2*k-3。然后考虑自然数n+k的染色,因为要保证S中可以存在的元素尽量多,所以它的染色情况尽量不能和前面的冲突(如果冲突了,比如染成了2,那么它和同样是颜色2的n+2组成的2*n+k+2就不能存在在S中,并且2*n+k+2之后的数也不能在S中了 因为S是连续的)
所以把自然数n+k染成第k种颜色,这样除最后一个数之外都可以和它相加,即组成的满足条件的和最大,最大和为2*n+2*k-2。
(当然可以多推几项找规律)
#include <bits/stdc++.h>
using namespace std;
int main()
{
int k;
while(~scanf("%d",&k))
{
if(k<2)
cout<<0<<'\n';
else
cout<<2*(k-1)<<'\n';
}
return 0;
}