1에서 까지의 각 숫자가 다중 집합 의 일부 요소의 합으로 고유하게 표현 될 수있는 다중 집합의 수


11

내 문제. 주어지면 유효한 다중 집합 의 수를 세고 싶습니다 . 멀티 세트 는 다음과 같은 경우에 유효합니다.S SnSS

  • 의 요소의 합 은 이며NSn
  • 에서 까지의 모든 숫자 는 의 일부 요소의 합계로 고유하게 표현 될 수 있습니다 .N 개의 S1nS

예. 예를 들어, 이면 이 유효합니다.{ 1 , 1 , 1 , 1 , 1 } , { 1 , 2 , 2 } , { 1 , 1 , 3 }n=5{1,1,1,1,1},{1,2,2},{1,1,3}

그러나 는 과 둘 다에 의해 2가 형성 될 수 있기 때문에 유효하지 않습니다 (즉, 2는 로 표현 될 수 있습니다) 및 )이므로 두 번째 조건은 유지되지 않습니다. 마찬가지로 3은 및 의해 형성 될 수 있습니다 .{ 1 , 1 } { 2 } 2 = 1 + 1 2 = 2 { 2 , 1 } { 1 , 1 , 1 }S={1,1,1,2}{1,1}{2}2=1+12=2{2,1}{1,1,1}

S={1,2,4 모든 숫자 때문에 무효이다} 행 고유 할 수 있지만, 원소의 총합 아니다 .5 S 515S5


나는이 문제에 대한 좋은 알고리즘을 꽤 오랫동안 찾으려고 노력했지만 해결할 수는 없습니다. codechef 에서 온 것 입니다. 제출 된 솔루션 중 일부를 보았지만 여전히 문제를 해결하기위한 논리를 얻을 수 없었습니다. 참고 : 질문에 대한 시간 제한은 10 초이고n<109

다중 집합의 경우 if 인 경우 가 다중 집합 S에서 번 발생 합니다 .a i < a j i < j a i c iS={(a1,c1),(a2,c2)...} ai<aji<jaici

지금까지 나는 결론을 도출했다

  • 필요한 정렬 된 다중 집합의 첫 번째 요소는 이어야합니다.1
  • 하자 는 두 속성에 따라 설정 한 다음r < kS={1,a2ak}|a1a2akr<k  ar+1=ar or (i=0rai)+1
  • 하자 , 어디 발생 번, 우리가 말할 수 위의 결론에서 다음 필요한 속성을 다음과 그 및 경우 . 증명 :a i c ii a i | n + 1 a i | a j j > i a i + 1 =S={(1,c1),(a2,c2)(ak,ck)}|a1a2akaicii ai|n+1ai|ajj>i
    ai+1=(aici+ai1)+1ai|ai+1
  • 이제 즉 모두 1 뒤의 숫자는 의 배수입니다 . 따라서 을 이러한 다중 집합의 개수로 설정 한 다음 여기서 가능한 모든 수의 ( )을 합산합니다 . 다른 말로하면d f ( n ) f ( n ) = d | n + 1S={1,11d1,d,dd,dm1,dm1dm1,dm2,dm2dm2,}df(n)1's=d1f(f(n)=d|n+1,d1f(n(d1)d)1s=d1f(n1)=g(n)=d|n,dng(d)

마지막으로 내 문제는 이것으로 줄어 듭니다 . 시간 제한을 초과하지 않도록 효율적인 방식으로 을 찾으십시오 .g(n)


2
다른 사람들에게 연습 문제에 대한 솔루션과 알고리즘을 공개적으로 게시하도록 요청하는 것이 적절한 지 확인 했습니까? Codechef FAQ 솔루션이 공개적으로 게시되지 않을 것으로 예상 합니다 (일부 기본적인 문제 제외). 여기에 해결책을 게시하는 것이 다른 사람들의 실습 문제를 망칠 수 있습니까? 저는 Codechef 커뮤니티의 규범과 에티켓에 익숙하지 않습니다.
DW

FAQ 에서 퍼블릭 도메인질문을 게시 하지 않는 것과 관련된 것을 찾지 못했습니다. 이 제한은 실제 문제가 아닌 진행중인 컨테스트 문제에 대한 것입니다.
법무부 리그

1
@DW 진행중인 경연 대회가 아닌 문제에 대해 이야기해도 괜찮을 것이라고 생각하지 않습니다.
라비 Upadhyay

1
입력 번호 의 파티션 수를 찾고 있습니다. 이 유행어를 사용하여 약간의 연구를해볼 것을 제안합니다.
Raphael

2
@Raphael, 나는 포스터가 그 기술들을 읽어야한다는 것에 동의한다. 그것은 정확히 같은 문제는 아닙니다. 포스터의 첫 번째 조건은 이것이 파티션이어야하지만 두 번째 조건은 추가 제한을 부과합니다 (독특한 변경을 위해 )-수를 계산하는 데 사용되는 것과 동일한 기술을 적용 할 수 있습니다 추가 요구 사항을 처리하기 위해 일부 수정이 포함 된 파티션.
DW

답변:


2

가장 빠른 해결책 은 다음과 같습니다 . 이는 실제로 함수 산출된다 이 주어 , 우리가 인자 (보기 아래) 다음 (아래 참조) 모든 요소를 계산 같은 몇 가지 순서로 의미 ) (속성 P. 우리는 이제 주어진 순서대로 인수를 통해 공식에 따라 계산 합니다. P의 속성 것을 보장 우리가 계산 될 때 , 이미 산출 한 모든 비 단순 요인에 대한 의 . 최적화도 있습니다 (아래 참조).n f 1 , , f m f i | f j i j g g ( d ) g ( e ) e d

g(n)=dnd<ng(d),g(1)=1.
nf1,,fmfi|fjijgg(d)g(e)ed

더 자세하게, 우리는 순서대로 요소들을 살펴보고, 각 요소 에 대해 나누는 요소를 확인하여 사소한 요소를 모두 찾습니다 .f 1 , , f i 1 f ifif1,,fi1fi

인수 분해 : 전처리 : Eratosthenes sieve를 사용하여 미만의 모든 소수 목록을 만듭니다 . 주어지면 우리는 단순히 시행 분할을 사용합니다. N109n

모든 요소 생성 : 재귀 적으로 수행됩니다. 이라고 가정하십시오 . 우리는 실행 중첩 루프 및 출력 . 귀납법으로 재산 P를 증명할 수 있습니다. t l 1{ 0 , , k 1 } , , l t{ 0 , , k t } p l 1 1p l t tn=p1k1ptkttl1{0,,k1},,lt{0,,kt}p1l1ptlt

최적화 : 프로그램은 여러 입력에서 실행되므로 메모를 사용하여 다른 입력에서 시간을 절약 할 수 있습니다. 우리는 작은 값 ( ) 만 메모리에 저장하여 모든 메모 된 값을 배열에 저장할 수 있습니다. 배열은 0으로 초기화되므로 이미 계산 된 값을 알 수 있습니다 (모든 계산 된 값이 양수이므로).105


소인수 분해 가 인 경우 은 에만 의존하며 실제로는 정렬 된 버전에만 의존합니다. 이 벡터. 미만의 모든 숫자 에는 최대 주요 요소 (반복 포함)가 있으며 이기 때문에 모든 요소에 대해 (또는 )를 재귀 적 으로 계산하는 것이 가능해 보입니다 . 다른 입력이 많을 경우이 솔루션이 더 빠를 수 있습니다. 그대로 최대 개가 있습니다 .p k 1 1 , , p k t t f ( n ) ( k 1 , , k t ) 10 9 29 p ( 29 ) = 4565 f g 10n+1p1k1,,ptktf(n)(k1,,kt)10929p(29)=4565fg10

파티션을 해당 매핑하는이 함수 가 명시적인 분석 형식을 가질 수도 있습니다. 예를 들어, , 는 A000670 에 의해 제공 되고 는 A005649 또는 A172109에 의해 제공됩니다 .g ( p k ) = 2 k - 1 g ( p 1p t ) g ( p 2 1 p 2p t )gg(pk)=2k1g(p1pt)g(p12p2pt)


1

좋아, 그래서 대한 되풀이 관계 가 있습니다 (질문 끝 참조).g()

이 시점에서 재귀 알고리즘을 작성하여 을 계산 하고 메모를 적용하여 두 번 이상 계산하지 않는 것이 자연스러운 방법입니다 . 즉, 를 계산할 때 를 매핑하는 해시 테이블에 저장합니다 . 나중에 다시 알아야 할 경우 해시 테이블에서 찾아 볼 수 있습니다.g ( I ) g ( I ) I g ( I ) g ( I )g(n)g(i)g(i)ig(i)g(i)

이 인수 분해 필요합니까 하지만, 인수 분해를위한 효율적인 알고리즘이 있습니다 때 .n n 10 9nnn109

정수 시퀀스의 온라인 백과 사전 에서 시퀀스를 조회 할 수도 있습니다 . 백과 사전에서 시퀀스를 찾으면 때로는 유용한 정보 (예 : 시퀀스 계산을위한 효율적인 알고리즘)를 제공합니다. 그래도 재미는 없어 질 것입니다.g(1),g(2),g(3),g(4),g(5),


0

다음은 시작하는 데 도움이되는 힌트입니다. 정수의 파티션 세트를 열거 하기 위해 표준 동적 프로그래밍 알고리즘 을 적용 하고, 모든 합계를 반복적으로 확인 하고 변경 하고 고유성을 확인 하여 고유 한 변경을 수행 할 수있는 논리를 추가하는 논리를 추가하십시오 .

좀 더 자세히 설명하면 : 다중 집합 가 있다고 가정하십시오 . 숫자 감안할 때 함께 , 어떻게의 submultiset 식별 할 수 에 총액 것을 ? 해당 하위 다중 집합이 고유한지 어떻게 확인할 수 있습니까? 변경을 위해 표준 동적 프로그래밍 기술 을 적용하십시오 . ( 이 질문 도 참조하십시오 .)i 1 i n S iSi1inSi

multiset의 감안할 때 , 당신은 어떻게 확인할 수 1에서 모든 숫자인지 즉, 그것은 만족 두 번째 조건, 여부 고유의 submultiset의 합으로 표현 될 수 (고유 변경 결정 조건)? 이전 문제를 해결하면 매우 쉽습니다.N SSnS

하자 당신의 조건을 모두 만족하는 멀티 세트의 목록을 나타낸다. 을 알고 있다면 어떻게 그 정보를 사용하여 있습니까? 정수의 파티션을 열거하기 위해 표준 동적 프로그래밍 기술을 적용 할 수 있습니다.P ( 1 ) , P ( 2 ) , , P ( n ) P ( n + 1 )P(n)P(1),P(2),,P(n)P(n+1)


아마도 더 나은 접근법이 있습니다.

가 두 조건을 모두 만족시키는 다중 집합이라고 가정 합니다 ( ). 요소가 하나 더 있는 멀티 세트 를 얻기 위해 어떻게 확장 할 수 있습니까? 다시 말해, 에 하나 이상의 요소를 추가 하여 두 조건을 모두 만족시키는 새로운 다중 집합 를 얻는 방법을 어떻게 식별 할 수 있습니까 (일부 )?SnTSTn

답 : 만약 의 일부 구성 요소들의 합으로서 표현 될 수 , 다음에 추가 소용 없다 야기 : 고유성 조건을 위반이. 따라서 의 일부 요소의 합으로 표현할 수없는 모든 정수 를 열거 할 수 있습니다 . 각각은 두 가지 조건을 충족시키는 새로운 다중 집합 를 얻기 위해 에 추가 될 수있는 것입니다 (다른 ).xSSTxSSTn

또한 의 일부 요소의 합으로 표현할 수있는 정수 와 동적 프로그래밍을 사용하지 않는 정수를 열거 할 수 있습니다 . 부울 의 2 차원 배열 을 작성합니다. 여기서 정수 를 일부의 합으로 표현하는 방법이 있으면 는 참 입니다. 제 의 요소 (첫 번째 요소 사용에 적격 여기서, , 이렇게 정렬 된 및 ). 참고SA[1|S|,1n]A[i,j]jiSiSSS={s1,s2,,sk}s1s2skA[i,j] 의 값을 사용하여 계산할 수 있습니다 . 특히, 이면 , 그렇지 않으면 입니다. 이를 통해 추가 될 후보 인 모든 숫자를 식별 할 수 있습니다 .A[1i1,1j1]A[i,j]=A[i1,j]A[i1,jsi]j>siA[i,j]=A[i1,j]S

다음으로, 각각의 후보에 대한 확장 의 (하나 개의 원소 첨가 한 ), 우리는 여부를 확인하고자하는 만족하는 조건을 모두. 하자 의 요소들의 합 나타낸다 하고, 의 요소의 합계 . 범위의 모든 정수 를 요소의 합계로 표현할 수 있는지 확인해야합니다 . 동적 프로그래밍을 사용하고 변경을위한 표준 알고리즘을 사용하여이 문제를 해결할 수도 있습니다. (사실, 여전히 배열 가있는 경우TSSTnSnTn+1,n+2,,nTA위에서 언급 한 것처럼이 문제를 해결하기 위해 쉽게 확장 할 수 있습니다. 배열 로 만들고 추가 항목을 모두 채우고 계속 확인하십시오. 는 모두 참입니다.) 이제 확장되는 모든 다중 집합 를 열거 할 수 있습니다. 단일 요소에 의한 이며 두 조건을 모두 만족합니다.A[1|T|,1n]T SA[|T|,n+1],A[|T|,n+2],,A[|T|,n]TS

이것은 즉시 모든 에서 어떤 경계까지 과 같이 조건을 만족하는 모든 다중 집합 를 열거하는 알고리즘을 제안합니다 . 우리는 배열을 가지게 되는데, 여기서 는 에 합산되는 모든 다중 집합 를 저장하고 , 일반적으로 은 합산되는 모든 다중 집합 집합을 저장합니다 .n n 20 P [ 1 20 ] P [ 5 ] S P [ n ] S nSnn20P[120]P[5]SP[n]Sn

다음으로 반복해서 채울 수 있습니다 . 하나의 다중 집합 만 포함하도록 을 설정하여 시작하십시오 . 각각 다음에, 각각 (1 내지 20 카운트 업) 가능한 모든 정보 열거 의 , 있도록 (상기 기술을 이용하여) 의 요소들의 합 나타내는 , 인서트 로 가 존재하지 않는 경우와 만약 .P [ 1 ] { 1 } n S P [ n ] T S n ' T T P [ n ' ] n '20P[n]P[1]{1}nSP[n]TSnTTP[n]n20

이것은 꽤 할 수 있어야합니다. 행운을 빕니다! 즐기세요! 세부 사항을 다루는 것은 동적 프로그래밍에서 좋은 학습 연습이 될 것입니다.


모든 정수 파티션은 지수 적이므로 열거 할 수 없습니다. 나는 질문을 편집하고 의 범위 와 내 생각의 일부를 포함 했지만 여전히 붙어 있습니다. 당신이 도울 수 있습니다. n
법무부 리그
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.