Số lượng nhiều phần sao cho mỗi số từ 1 đến có thể được biểu diễn duy nhất dưới dạng tổng của một số phần tử của đa phần


11

Vấn đề của tôi. Với , tôi muốn đếm số hợp lệ multisets . Một multiset là hợp lệ nếunSS

  • Tổng các phần tử của là vàSn
  • Mỗi số từ đến có thể biểu diễn duy nhất như một khoản tiền của một số các yếu tố của .1nS

Thí dụ. Ví dụ: nếu thì là hợp lệ.n=5{1,1,1,1,1},{1,2,2},{1,1,3}

Tuy nhiên, không hợp lệ vì 2 có thể được tạo bởi cả và (nghĩa là 2 có thể được biểu thị bằng cả và ), vì vậy điều kiện thứ hai không giữ được. Tương tự 3 có thể được hình thành bởi và .{ 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}

1 5 S 5S={1,2,4 } cũng không hợp lệ vì tất cả các số từ đến có thể được tạo duy nhất, nhưng tổng các phần tử của không phải là .15S5


Tôi đã cố gắng tìm một thuật toán tốt cho vấn đề này trong một thời gian khá lâu nhưng không thể giải quyết nó. Đó là từ codechef . Tôi đã thấy một số giải pháp được gửi nhưng tôi vẫn không thể có được logic để giải quyết vấn đề. LƯU Ý: Giới hạn thời gian cho câu hỏi là 10 giây vàn<109

Đối với nhiều trang, tôi sẽ sử dụng ký hiệu nếu , có nghĩa là xảy ra lần trong multiset S.a i < a j i < j a i c iS={(a1,c1),(a2,c2)...} ai<aji<jaici

Cho đến bây giờ tôi đã rút ra một số kết luận

  • Phần tử đầu tiên của multiset được sắp xếp bắt buộc phải là1
  • Đặt là một tập hợp theo hai thuộc tính sau đór < k a r + 1 = a r  hoặc  ( r i = 0 a i ) + 1S={1,a2ak}|a1a2akr<k  ar+1=ar or (i=0rai)+1
  • Đặt , trong đó đang xảy ra lần, theo các thuộc tính bắt buộc sau đó từ kết luận trên, chúng ta có thể nói rằng và nếu . Chứng minh:một i c ii một 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
  • Bây giờ hãy xem xét tức là tất cả các số tiếp theo sau 1 sẽ là bội của . Vì vậy, hãy để là số lượng của nhiều trang như vậy có thể sau đó trong đó tôi đang tổng hợp tất cả số có thể là ( ). Nói cách khác,d f ( n ) f ( n ) = d | n + 1S={1,11d1,d,dd,dm1,dm1dm1,dm2,dm2dm2,}df(n)1s=d-1f(n-1)=g(n)=d| n,dng(d)f(n)=d|n+1,d1f(n(d1)d)1s=d1f(n1)=g(n)=d|n,dng(d)

Cuối cùng, vấn đề của tôi đã giảm xuống - hãy tìm một cách hiệu quả để nó không vượt quá giới hạn thời gian.g(n)


2
Bạn đã kiểm tra xem có phù hợp để yêu cầu người khác đăng công khai các giải pháp và thuật toán cho các vấn đề thực tiễn không? Câu hỏi thường gặp về Codechef dường như hy vọng rằng các giải pháp sẽ không được đăng công khai (ngoại trừ một số vấn đề rất cơ bản). Sẽ đăng một giải pháp ở đây là "làm hỏng" các vấn đề thực hành cho người khác, hoặc điều đó được coi là OK? Tôi không quen thuộc với các quy tắc và nghi thức của cộng đồng Codechef.
DW

Tôi đã không tìm thấy bất cứ điều gì liên quan đến việc không đăng câu hỏi trên miền công cộng trong faq và hạn chế này là về các vấn đề cuộc thi đang diễn ra không phải là vấn đề thực hành.
giải đấu công lý

1
@DW Tôi không nghĩ họ sẽ phiền nếu chúng ta thảo luận về các biểu tượng không phải từ các cuộc thi đang diễn ra.
Ravi Upadhyay

1
Bạn đang tìm kiếm số lượng phân vùng của số đầu vào. Tôi đề nghị bạn thực hiện một số nghiên cứu bằng cách sử dụng từ thông dụng này.
Raphael

2
@Raphael, tôi đồng ý, người đăng nên đọc những kỹ thuật đó. Đây không phải là cùng một vấn đề - điều kiện đầu tiên của người đăng yêu cầu đây là phân vùng, nhưng điều kiện thứ hai áp đặt các hạn chế bổ sung (đối với thay đổi duy nhất ) - nhưng có thể áp dụng các kỹ thuật tương tự được sử dụng để đếm số của các phân vùng, với một số sửa đổi để đối phó với yêu cầu bổ sung.
DW

Câu trả lời:


2

Đây là những gì giải pháp nhanh nhất đang làm. Nó thực sự tính toán hàm của bạn Với , chúng tôi tính hệ số này (xem bên dưới) và sau đó tính toán tất cả các yếu tố (xem bên dưới) theo một số thứ tự sao cho ngụ ý (thuộc tính P). Bây giờ chúng ta tính theo công thức bằng cách xem xét các yếu tố theo thứ tự đã cho. Thuộc tính P đảm bảo rằng khi chúng ta tính , chúng ta đã tính cho tất cả các yếu tố không tầm thường của . Ngoài ra còn có một tối ưu hóa (xem bên dưới).n f 1 , Mạnh , 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

Chi tiết hơn, chúng tôi xem xét các yếu tố theo thứ tự và với mỗi yếu tố , chúng tôi tìm thấy tất cả các yếu tố không tầm thường của nó bằng cách kiểm tra xem chia .f 1 , ... , f i - 1 f ifif1,,fi1fi

Bao thanh toán: Tiền xử lý: chúng tôi lập danh sách tất cả các số nguyên tố dưới bằng cách sử dụng sàng Eratosthenes. Cho , chúng tôi chỉ đơn giản là sử dụng phân chia thử nghiệm. n109n

Tạo tất cả các yếu tố: Điều này được thực hiện đệ quy. Giả sử . Chúng tôi chạy lồng nhau vòng , và đầu ra . Bạn có thể chứng minh tính chất P bằng cảm ứng.tl1{0,...,k1},...,lt{0,...,kt}p l 1 1p l t tn=p1k1ptkttl1{0,,k1},,lt{0,,kt}p1l1ptlt

Tối ưu hóa: Vì chương trình được chạy trên một số đầu vào, chúng tôi có thể sử dụng ghi nhớ để tiết kiệm thời gian trên các đầu vào khác nhau. Chúng tôi chỉ ghi nhớ các giá trị nhỏ (tối đa ) và điều này cho phép chúng tôi lưu trữ tất cả các giá trị ghi nhớ trong một mảng. Mảng được khởi tạo bằng số 0 và vì vậy chúng ta có thể biết giá trị nào đã được biết (vì tất cả các giá trị được tính là dương).105


Nếu hệ số nguyên tố của là , thì chỉ phụ thuộc vào và trên thực tế chỉ trên phiên bản được sắp xếp của vector này. Mỗi số dưới có nhiều nhất yếu tố chính (có độ lặp lại) và vì , có vẻ khả thi để tính (hay đúng hơn là ) cho tất cả chúng, theo cách đệ quy. Giải pháp này có thể nhanh hơn nếu có nhiều đầu vào khác nhau; vì nó là, có nhiều nhất là .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

Cũng có thể hàm này, ánh xạ các phân vùng tới tương ứng , có dạng phân tích rõ ràng. Ví dụ: , được đưa ra bởi A000670 và được đưa ra bởi A005649 hoặc A172109 .g ( p k ) = 2 k - 1 g (gg(pk)=2k1g ( p 2 1 p 2 ... p t )g(p1pt)g(p12p2pt)


1

OK, vì vậy bạn có mối quan hệ lặp lại cho (xem phần cuối câu hỏi của bạn).g()

Tại thời điểm này, có vẻ như một cách tiếp cận tự nhiên sẽ là viết ra thuật toán đệ quy để tính và áp dụng ghi nhớ để bạn không tính nhiều lần. Nói cách khác, khi bạn tính , bạn lưu nó trong bảng băm ánh xạ ; nếu bạn cần biết lại trong tương lai, bạn có thể tra cứu nó trong bảng băm.g ( i ) g ( i ) i g ( i ) g ( i )g(n)g(i)g(i)ig(i)g(i)

Điều này không yêu cầu bao thanh toán , nhưng có các thuật toán hiệu quả để bao thanh toán khi .n n 10 9nnn109

Bạn cũng có thể tra cứu chuỗi trong Từ điển bách khoa trực tuyến về chuỗi số nguyên . Nếu bạn tìm thấy trình tự trong bách khoa toàn thư của họ, đôi khi họ sẽ cung cấp thêm thông tin hữu ích (ví dụ: thuật toán hiệu quả để tính toán trình tự). Điều đó thừa nhận có thể mang niềm vui ra khỏi mọi thứ, mặc dù.g(1),g(2),g(3),g(4),g(5),


0

Đây là một gợi ý để bạn bắt đầu. Áp dụng các thuật toán lập trình động tiêu chuẩn để liệt kê tập hợp các phân vùng của một số nguyên và thêm một số logic để kiểm tra xem các thuật toán nào cho phép thực hiện thay đổi duy nhất bằng cách kiểm tra lặp lại tất cả các khoản tiền, thực hiện thay đổi và xác minh tính duy nhất.

Chi tiết hơn một chút: Giả sử bạn có . Cho một số với , làm thế nào bạn có thể xác định một tiểu trình của mà tổng hợp với ? Làm thế nào bạn có thể kiểm tra xem Subultiset đó là duy nhất? Cố gắng thích ứng các kỹ thuật lập trình động tiêu chuẩn để tạo ra sự thay đổi . (Xem thêm câu hỏi này .)i 1 i n S iSi1inSi

Với một đa , làm thế nào bạn có thể kiểm tra xem nó có thỏa mãn điều kiện thứ hai hay không, tức là, liệu mọi số từ 1 đến có thể được biểu diễn duy nhất dưới dạng tổng của một hàm con của (điều kiện thay đổi duy nhất) không? Điều này sẽ khá dễ dàng, nếu bạn đã giải quyết cái trước.n SSnS

hãy để biểu thị danh sách các đa thỏa mãn cả hai điều kiện của bạn. Nếu bạn biết , làm thế nào bạn có thể sử dụng thông tin đó để xây dựng ? Ở đây bạn có thể muốn điều chỉnh các kỹ thuật lập trình động tiêu chuẩn để liệt kê các phân vùng của một số nguyên.P ( 1 ) , P ( 2 ) , Mạnh , P ( n ) P ( n + 1 )P(n)P(1),P(2),,P(n)P(n+1)


Đây là một cách tiếp cận có thể sẽ tốt hơn.

Giả sử là một multiset thỏa mãn cả hai điều kiện của bạn (cho ). Làm thế nào chúng ta có thể mở rộng nó để có được nhiều có nhiều yếu tố hơn? Nói cách khác, làm thế nào chúng ta có thể xác định tất cả các cách để thêm một phần tử nữa vào , để có được một nhiều phần mới thỏa mãn cả hai điều kiện của bạn (đối với một số )?SnTSTn

Trả lời: nếu có thể được biểu thị dưới dạng tổng của một số phần tử của , thì không có điểm nào để thêm nó vào : điều đó sẽ khiến vi phạm điều kiện duy nhất. Vì vậy, chúng ta có thể liệt kê tất cả các số nguyên mà không thể được diễn tả như một khoản tiền của một số các yếu tố của ; mỗi cái là một thứ có khả năng có thể được thêm vào để có được một trang mới sẽ thỏa mãn cả hai điều kiện (đối với một số khác ).xSSTxSSTn

Ngoài ra, có thể liệt kê các số nguyên nào có thể được biểu diễn dưới dạng tổng của một số phần tử của và không thể sử dụng lập trình động. Bạn xây dựng một mảng hai chiều của booleans, trong đó là đúng nếu có một cách để biểu thị số nguyên là tổng của một số Các phần tử đầu tiên của (chỉ các phần tử đầu tiên của đủ điều kiện được sử dụng; trong đó đã được sắp xếp, do đó và ). Lưu ý rằngA [ 1 Lọ | S | , 1 ... n ] Một [ iSA[1|S|,1n]A[i,j]jiSiSSS={s1,s2,,sk}s1s2skA[i,j]có thể tính toán bằng các giá trị của : đặc biệt, nếu hoặc nếu không. Điều này cho phép chúng ta xác định tất cả các số đó là ứng cử viên để được thêm vào .A[1i1,1j1]A[i,j]=A[i1,j]A[i1,jsi]j>siA[i,j]=A[i1,j]S

Tiếp theo, đối với mỗi phần mở rộng ứng viên của (thu được bằng cách thêm một phần tử vào ), chúng tôi muốn kiểm tra xem thỏa mãn cả hai điều kiện hay không. Hãy biểu thị tổng của các yếu tố của , và tổng của các yếu tố của . Chúng ta cần phải kiểm tra xem tất cả các số nguyên trong phạm vi có thể được thể hiện dưới dạng một khoản tiền của một số các yếu tố của . Điều này cũng có thể được giải quyết bằng lập trình động, sử dụng các thuật toán tiêu chuẩn để thực hiện thay đổi. (Trong thực tế, nếu bạn vẫn có mảngS S T n S n 'TSSTnSnTn+1,n+2,,nTAđã đề cập ở trên, bạn có thể dễ dàng mở rộng nó một chút để giải quyết vấn đề này: chúng tôi biến nó thành một mảng , tiếp tục điền vào tất cả các mục bổ sung và đảm bảo rằng đều đúng.) Vì vậy, bây giờ chúng ta có thể liệt kê tất cả các đa mục mở rộng bởi một yếu tố duy nhất và đáp ứng cả hai điều kiện.A[1|T|,1n]T SA[|T|,n+1],A[|T|,n+2],,A[|T|,n]TS

Điều này ngay lập tức gợi ý một thuật toán để liệt kê tất cả các multisets thỏa mãn điều kiện của bạn, cho tất cả lên đến một số ràng buộc, giả sử . Chúng ta sẽ có một mảng , trong đó lưu trữ tất cả các đa số có tổng bằng 5, và nói chung, lưu trữ tập hợp của tất cả các đa số có tổng bằng .n n 20 P [ 1 ... 20 ] P [ 5 ] S P [ n ] S nSnn20P[120]P[5]SP[n]Sn

Tiếp theo, chúng ta có thể điền vào lặp đi lặp lại. Bắt đầu bằng cách đặt để chỉ chứa một multiset . Tiếp theo, với mỗi (đếm từ 1 đến 20), với mỗi , hãy liệt kê tất cả các phần mở rộng có thể của (sử dụng các kỹ thuật ở trên), hãy biểu thị tổng các phần tử của , và chèn vào nếu nó chưa xuất hiện và nếu .P [ 1 ] { 1 } n S P [ n ] T S n T TP[n]P[1]{1}nSP[n]TSnTTn '20P[n]n20

Điều này nên được thực hiện khá. Chúc may mắn! Chúc vui vẻ! Làm việc thông qua các chi tiết sẽ là một bài tập học tập tốt trong lập trình động.


Tôi không thể liệt kê tất cả các phân vùng số nguyên vì nó sẽ theo cấp số nhân. Tôi đã chỉnh sửa câu hỏi và bao gồm phạm vi của và một số suy nghĩ của tôi nhưng tôi vẫn bị mắc kẹt. Có thể là bạn có thể giúp đỡ. n
giải đấu công lý
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.