1'den kadar olan her sayı, çoklu setin bazı öğelerinin toplamı olarak benzersiz bir şekilde ifade edilebilecek şekilde çoklu set sayısı


11

Benim sorunum. verildiğinde , geçerli çoklu setlerin sayısını saymak istiyorum . Multiset , aşağıdaki durumlarda geçerlidirnSS

  • Elemanlarının toplamı olduğu , veSn
  • Her sayı için bazı elemanları bir toplamı olarak benzersiz ifade edilebilir .1nS

Misal. Örneğin, eğer , sonra geçerlidir.n=5{1,1,1,1,1},{1,2,2},{1,1,3}

Ancak, geçersiz çünkü 2 hem hem de \ {2 \} tarafından oluşturulabilir (yani 2, hem 2 = 1 + olarak ifade edilebilir 1 ve 2 = 2 ), bu nedenle ikinci koşul geçerli değildir. Benzer şekilde \ {2,1 \} ve \ {1,1,1 \} tarafından 3 oluşturulabilir .S={1,1,1,2}{1,1}{2}2=1+12=2{2,1}{1,1,1}

S={1,2,4 tüm sayılar, çünkü} da geçersiz 1 bulundunuz 5 benzersiz yapılabilir, ancak elemanlarının toplamı S değildir 5 .


Bu sorun için iyi bir algoritma bulmaya çalıştım ama çözemiyorum. Bu arasındadır codechef . Gönderilen çözümlerden bazılarını gördüm, ancak yine de sorunu çözmek için mantık alamadım. NOT: Soru için süre sınırı 10 saniyedir ve n<109

Bir multiset için bir gösterim kullanır a i < a jS={(a1,c1),(a2,c2)...} ai<aj ise i<j anlamına gelir, ai meydana ci multiset S. kez

Şimdiye kadar bazı sonuçlar çıkardım

  • Gerekli sıralanmış multiset ilk elemanı 1 olmalıdır1
  • Let iki özelliği izleyen bir küme olur, sonrar < k a r + 1 = a r  veya  ( r i = 0 a i ) + 1S={1,a2ak}|a1a2akr<k  ar+1=ar or (i=0rai)+1
  • Let , nerede oluştuğu kez, diyebiliriz yukarıdaki sonuca dan sonra gerekli özelliklere uyduğunu ve eğer . İspat: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
  • Şimdi yani hepsini 1'den sonraki sayılar katları olacaktır . Öyleyse mümkün olan bu çoklu kümenin sayısı olsun, sonra burada olası tüm sayısı ( ) üzerinde toplanıyorum . Diğer bir deyişled 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)

Sonunda benim sorunum buna indirgenmiştir - 'yi etkin bir şekilde bulun , böylece zaman sınırını aşmaz.g(n)


2
Uygulama sorunlarından ötürü başkalarından çözüm ve algoritma yayınlamalarını istemenin uygun olup olmadığını kontrol ettiniz mi? Codechef SSS , çözümlerin herkese açık olarak yayınlanmayacağını umuyor (bazı çok temel sorunlar hariç). Burada bir çözüm yayınlamak başkaları için uygulama problemlerini "bozmak" mıdır, yoksa bu iyi sayılır mı? Codechef topluluğunun normlarına ve görgü kurallarına aşina değilim.
DW

SSS'de kamu malı hakkında soru yayınlamama ile ilgili hiçbir şey bulamadım ve bu kısıtlama, uygulama probleminde değil devam eden yarışma sorunları üzerinde.
adalet ligi

1
@DW Devam eden yarışmalardan olmayan prblemleri tartışırsak sorun olur diye düşünmüyorum.
Ravi Upadhyay

1
Girilen numaranın bölüm sayısını arıyorsunuz . Bu anahtar kelimeyi kullanarak biraz araştırma yapmanızı öneririm.
Raphael

2
@ Raphael, katılıyorum, poster bu teknikleri okumalı. Tam olarak aynı sorun değil - posterin ilk koşulu bunun bir bölüm olmasını gerektiriyor, ancak ikinci koşul ek kısıtlamalar getiriyor (benzersiz değişiklik yapmak için ) - ancak sayıyı saymak için kullanılan aynı teknikleri uygulamak mümkün olabilir ek gereksinimle başa çıkmak için bazı değişiklikler ile.
DW

Yanıtlar:


2

İşte en hızlı çözüm . Gerçekten de, işlev işlem olup göz önüne alındığında , bunu faktör (bkz ve sonra (P özelliği) anlamına tüm faktörleri (aşağıya bakın) bir sırayla . Şimdi hesaplama verilen sırayla faktörleri üzerinde giderek formüle göre. İşletme P olmasını sağlar biz işlem zaman , daha önce hesaplanmış olan tüm önemsiz olmayan faktörler için ait . Bir optimizasyon da var (aşağıya bakın)., n f 1 , ... , m 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

Daha ayrıntılı olarak, sırayla faktörleri üzerinden gitmek ve her faktör için , biz kontrol ederek onun önemsiz olmayan faktörlerin hepsini bulmak böler .f 1 , , f i - 1 f ifif1,,fi1fi

Faktoring: Önişleme: Eratosthenes eleğini kullanarak altındaki tüm primerlerin bir listesini yaparız . verildiğinde , sadece deneme bölümünü kullanıyoruz. n109n

Tüm faktörlerin oluşturulması: Bu özyinelemeli olarak yapılır. Diyelim ki . Biz çalıştırmak , iç içe geçmiş halkalar ve çıkış . P özelliğini indüksiyonla kanıtlayabilirsiniz. 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

Optimizasyon: Program çeşitli girişlerde çalıştığından, farklı girişlerde zaman kazanmak için notu kullanabiliriz. Yalnızca küçük değerleri ( ) hatırlarız ve bu, tüm kaydedilmiş değerleri bir dizide saklamamıza olanak tanır. Dizi sıfırlarla başlatılır ve böylece hangi değerlerin zaten bilindiğini söyleyebiliriz (hesaplanan tüm değerler pozitif olduğundan).105


Eğer bir asal çarpanlara olduğunu o, sadece bağlıdır , ve aslında sadece sıralanmış versiyonunda bu vektör. altındaki her sayı en fazla asal faktöre (tekrarlı) sahiptir ve , hepsi için (veya daha doğrusu ) tekrar hesaplanması mümkündür . Birçok farklı girdi olsaydı bu çözüm daha hızlı olabilirdi; olduğu gibi, en fazla .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

Bölümleri karşılık gelen eşleştiren bu fonksiyonun açık bir analitik forma sahip olması da mümkündür . Örneğin, , A000670 tarafından , A005649 veya A172109 tarafından verilir .g ( p k ) = 2 k - 1 g ( p 1p t ) g ( p 2 1 p 2p t )gg(pk)=2k1g(p1pt)g(p12p2pt)


1

Tamam, böylece için bir yineleme ilişkiniz var (sorunuzun sonuna bakın).g()

Bu noktada doğal bir yaklaşım, yi hesaplamak için özyinelemeli algoritmayı yazmak ve kereden fazla hesaplamamak için notu uygulamak gibi görünüyor . Başka bir deyişle, , bunu ; Gelecekte tekrar yi bilmeniz gerekiyorsa , hash tablosuna bakabilirsiniz.g ( i ) g ( i ) i g ( i ) g ( i )g(n)g(i)g(i)ig(i)g(i)

Bu faktoring gerektirir ancak faktoring için verimli algoritmalar vardır zaman .n n 10 9nnn109

Ayrıca sekansının görünebilir içinde tamsayı Dizilerin On-Line Ansiklopedisi . Sekansı ansiklopedisinde bulursanız, bazen ek yararlı bilgiler sağlarlar (örneğin, sekansı hesaplamak için etkili algoritmalar). Ancak, kuşkusuz, eğlenceyi bir şeylerden çıkarabilir.g(1),g(2),g(3),g(4),g(5),


0

İşte başlamanız için bir ipucu. Bir tamsayının bölüm kümesini numaralandırmak için standart dinamik programlama algoritmaları uygulayın ve tüm toplamları tekrarlı olarak kontrol ederek, değişiklik yaparak ve benzersizliği doğrulayarak bunlardan hangisinin benzersiz değişiklik yapmaya izin verdiğini kontrol etmek için biraz mantık ekleyin .

Biraz daha ayrıntılı olarak: Çok ayarlı bir sahip olduğunuzu varsayın . Bir numara Verilen ile , nasıl bir submultiset teşhis edebilir için toplamlar o ? Bu altkümenin benzersiz olup olmadığını nasıl kontrol edebilirsiniz? Değişiklik yapmak için standart dinamik programlama tekniklerini uyarlamaya çalışın . (Ayrıca bu soruya bakın .)i 1 i n S iSi1inSi

Bir çoklu küme verildiğinde , ikinci koşulu yerine getirip getirmediğini, yani 1'den kadar olan her sayının bir alt-toplamının (benzersiz değişiklik yapma koşulu) toplamı olarak benzersiz bir şekilde ifade edilip edilemeyeceğini nasıl kontrol edebilirsiniz ? Bir öncekini çözdüyseniz, bu oldukça kolay olmalı.n SSnS

let için koşulların her ikisi de tatmin MULTISETS listesini belirtir. Eğer bilseydim , nasıl inşa için bu bilgileri kullanabilirsiniz ? Burada, bir tamsayının bölümlerini numaralandırmak için standart dinamik programlama tekniklerini uyarlamak isteyebilirsiniz.P ( 1 ) , P ( 2 ) , , P ( n ) P ( n + 1 )P(n)P(1),P(2),,P(n)P(n+1)


İşte muhtemelen daha iyi olacak bir yaklaşım.

Diyelim ki , her iki koşulunuzu da karşılayan bir multisettir ( ). Bir elemanı daha olan bir çoklu-set elde etmek için bunu nasıl uzatabiliriz ? Başka bir deyişle, her iki koşulunuzu da karşılayan yeni bir çoklu set elde etmek için bir eleman daha eklemenin tüm yollarını nasıl belirleyebiliriz (bazı )?n T S T n SnTSTn

Cevap: eğer elemanları bazılarının bir toplamı olarak ifade edilebilir , daha sonra eklemeden de anlamı yok neden olur: tekliği koşulu ihlal etmek. Yani, hepimiz tamsayılar numaralandırabilmesidir edemez unsurlarının bazılarının bir toplamı olarak ifade edilebilir ; her biri, her iki koşulu da (diğer bazı ) karşılayacak yeni bir çoklu set elde etmek için potansiyel olarak eklenebilecek bir şeydir .S S T x S S T nxSSTxSSTn

Dahası, hangi S tamsayılarının öğelerinin bazılarının toplamı olarak ifade edilebileceğini ve hangilerinin dinamik programlama kullanılarak ifade edilebileceğini saymak mümkündür . Bir iki-boyutlu dizi oluşturmak Boolean, bir tamsayı ifade etmek için bir yol ise geçerlidir bazı bir toplamı olarak ilk elemanları (yalnızca ilk unsurları kullanılacak uygun olan, burada , bu kriteri olan ve ). olduğuna dikkat edinA [ 1 | S | , 1 n ] A [ i , j ] j i S i S S S = { s 1 , s 2 , , s k } s 1s 2s k A [ i , j ] A [ 1 Ben -SA[1|S|,1n]A[i,j]jiSiSSS={s1,s2,,sk}s1s2skA[i,j] değerlerini kullanarak hesaplanabilir : özellikle, eğer veya , aksi. Bu, eklenecek aday olan tüm sayıları belirlememizi sağlar .A [ i , j ] = A [ i - 1 , j ] A [ i - 1 , j - s i ] j > s i A [ i , j ] = A [ i - 1 , j ] SA[1i1,1j1]A[i,j]=A[i1,j]A[i1,jsi]j>siA[i,j]=A[i1,j]S

Daha sonra, her bir aday uzantısı ait (bir eleman eklenmesi ile elde edilen ), biz olup olmadığını kontrol etmek isteyen tatmin her iki koşulu. Let unsurlarının toplamı ifade ve elemanlarının toplamı . aralığındaki her tamsayının öğelerinin bazılarının toplamı olarak ifade edilip edilemeyeceğini kontrol etmeliyiz . Bu da dinamik programlama kullanılarak, değişiklik yapmak için standart algoritmalar kullanılarak çözülebilir. (Aslında, hala dizisine sahipsenizS S T n S n T n + 1 , n + 2 , , n T A A [ 1 | T | , 1 n ] A [ | T | , n + 1 ] , A [ | T | , n + 2 ] , , ATSSTnSnTn+1,n+2,,nTAYukarıda bahsedilen, bu sorunu çözmek için kolayca biraz uzatabilirsiniz: dizisi yapıyoruz , tüm ek girişleri doldurmaya devam ediyoruz ve hepsi doğrudur.) Yani, şimdi uzanan tüm çoklu ayarları sayabiliriz tek bir eleman tarafından ve her iki koşulu da karşılar.A[1|T|,1n]T SA[|T|,n+1],A[|T|,n+2],,A[|T|,n]TS

Bu, derhal bağlı tüm için, durumunuzu karşılayan tüm çoklu kümeleri numaralandırmak için bir algoritma önerir . Bu bir dizi olacak , saklar tüm MULTISETS 5 bu toplamı ve genel olarak, saklar tüm MULTISETS grubu bu miktar .n n 20 P [ 1 20 ] P [ 5 ] S P [ n ] S nSnn20P[120]P[5]SP[n]Sn

Daha sonra tekrar tekrar doldurabiliriz . i yalnızca bir çoklu kümesi içerecek şekilde ayarlayarak başlayın . Her biri için Daha sonra, her biri için, (1 ila 20 kadar saymaya) olası bütün uzantıları numaralandırmak, ve , izin (yukarıdaki teknikleri kullanılarak) elemanlarının toplamı ifade , ve eğer mevcut değilse ve ise içine yerleştirin .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

Bu oldukça yapılabilir. İyi şanslar! İyi eğlenceler! Ayrıntılar üzerinde çalışmak dinamik programlamada iyi bir öğrenme alıştırması olacaktır.


Tüm tamsayı bölümlerini numaralandıramıyorum çünkü üstel olacak. Soruyu düzenledim ve aralığını ve düşüncelerimin bazılarını dahil ettim ama yine de sıkıştım. Belki yardım edebilirsin. n
adalet ligi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.