Dairesel Sınırlı Toplamlar


10

Meydan okuma

N0 ile Mkapsayıcı arasında bir tamsayılar hayal edelim ve diyelim F.

Toplamda (M + 1) ** Nolası Fs vardır.

Bu tür kaç Ftanesi aşağıdaki eşitsizliklerin tümünü karşılar (indeks tek tabanlıdır)?

  • F[n] + F[n+1] <= M için 1 <= n < N
  • F[N] + F[1] <= M

İki pozitif tamsayı alan N ve Mcevabı herhangi bir uygun biçimde veren bir program veya fonksiyon yazın .

Test Durumları

(N,M) => Answer

(1,1) => 1
(2,1) => 3
(3,1) => 4
(4,1) => 7

(1,2) => 2
(2,2) => 6
(3,2) => 11
(4,2) => 26

(10,3) => 39175
(10,4) => 286555
(10,5) => 1508401

(25,3) => 303734663372
(25,4) => 43953707972058
(25,5) => 2794276977562073

(100,3) => 8510938110502117856062697655362747468175263710
(100,4) => 3732347514675901732382391725971022481763004479674972370
(100,5) => 60964611448369808046336702581873778457326750953325742021695001

açıklama

M (max value of element) = 1

F[1] + F[1] <= 1; F = [0]
(1,1) => 1

F[1] + F[2] <= 1; F = [0,0], [0,1], [1,0]
(2,1) => 3

F = [0,0,0], [0,0,1], [0,1,0], [1,0,0]
(3,1) => 4

F = [0,0,0,0], [0,0,0,1], [0,0,1,0], [0,1,0,0], [0,1,0,1], [1,0,0,0], [1,0,1,0]
(4,1) => 7

---

M = 2

F[1] + F[1] <= 2; F = [0], [1]
(1,2) => 2

F = [0,0], [0,1], [0,2], [1,0], [1,1], [2,0]
(2,2) => 6

F = [0,0,0], [0,0,1], [0,0,2], [0,1,0], [0,1,1], [0,2,0], [1,0,0], [1,0,1],
[1,1,0], [1,1,1], [2,0,0]
(3,2) => 11

(4,2) => 26 (left as exercise for you)

kurallar

  • Bu sorunudur. Kodunuzun zaman karmaşıklığı içinde polinom olmalıdır MveN (örneğin tüm (M + 1) ** Ntuples'ları üretemez ve ardından durumu kontrol edemezsiniz ). Lütfen gönderiminizde yaklaşımınızı açıklayınız.
  • Standart kuralları geçerlidir. Bayt cinsinden en kısa cevap kazanır.

Yanıtlar:


7

Python ile numpy , 59 bayt

lambda M,N:trace(mat(tri(M+1)[::-1])**N)
from numpy import*

Çevrimiçi deneyin!

Yolları saymak için matris çarpımını kullanır. Şamandıra hassasiyeti bir sorunsa, matbelirtebilir mat(...,int).


Kullanım vakalar mat(...,int)için işe yaramıyor gibi görünüyor n=100. Yöntem doğrudur (örneğin karakteristik polinomun köklerinin güçlerini toplamak için sempatik kullanmak işe yarar), ancak sayılar arttıkça numpy bir yerde yanlış gidiyor (belki de **güç operatörü?)
Jonathan Allan

4

Pyth , 27 bayt

.N?Ys:RTtYh-QNgQ+NTs:Rdtszh

gösteri

Şu formatta girdi bekliyor:

M
N

Bu, şimdiye kadar ayarlanan değerlerin sol ucunda, sağ uçta ve aralığın mevcut boyutunda klasik dinamik programlamadır.

Sahte kod / Python'da nasıl çalışır:

.N          | define memoized fill(left, right, gap):
?           | if cap > 0 then
s:RTtY      | sum(fill(i, right, gap - 1)
h-QN        |     for i in range(M - left + 1))
gQ+NT       | else M >= left + right
            | output:
s:Rdtsz     | sum(fill(i, i, N - 1)
h           |     for i in range(M + 1))

Qiçin kullanılan M, zkullanılan N, :bir fill, Nolduğu left, Tolduğunu right, Yolduğunu gap.


4

MATL , 13 12 bayt

Q:&>~PiY^Xds

Çevrimiçi deneyin! Bu, xnor'ın Python cevabı ve ilk MATL cevabımın doğrudan çevirisidir , bu yüzden muhtemelen uygun değildir. Örneğin, sol üst üçgen matrisi almanın daha kısa bir yolu vardır t&lYRP. Düzenleme: Ve orada, yani çıkıyor :&>~P. -1 byte için Luis Mendo'ya teşekkürler!

               M is the first input and N the second
Q:             increment M and generate range from 1 to M+1
  &>           compare vector element wise with itself with greater-than function
               results in a upper-right triangular matrix
    ~          inverse to get lower-left triangular matrix
     P         flip rows to get upper-left triangular matrix
      i        input N
       Y^      take the matrix to the power of N
         Xds   compute the sum of the main diagonal

@LuisMendo Teşekkürler! Sadece bir bayt olmasına rağmen veya atılabilecek başka bir şey var mı?
Laikoni

1
Hayır, işte bu, sayamam :-D
Luis Mendo

2

Stax , 17 bayt

°(√&╒íƽ╨⌂'├╖▼1_Z

Çalıştır ve hata ayıkla

Ambalajından çıkarılmış, golf edilmemiş ve yorum yapılmış gibi görünüyor.

^1](    [1, 0, ... 0] with M zeroes
:)      get all rotations of the array
{       begin block
  {:+rm map each array to reverse(prefixSums(arr))
},v*    execute preceding block N-1 times
F       for each array, execute the rest of the program
  iT    remove the last i elements from the array, where i is the iteration index
  F+    add the remaining elements to the running total
        implicitly print output

Bunu çalıştır


2

R , 72 bayt

function(M,N)sum(diag(Reduce(`%*%`,rep(list(outer(0:M,0:M,"+")<=M),N))))

Çevrimiçi deneyin!

Xnor'ın yaklaşımını açıklar.

R yalnızca 32 bit tamsayı desteğine sahip olduğundan ( doublemaks int değerine ulaşıldıktan sonra yayınlanır) daha büyük test durumları için başarısız olur , bu nedenle gmpveya başka bir rasgele hassas aritmetik kitaplığı gerekir.

Tuhaf bir şekilde, R ^her zaman elemanlı olarak uygulandığı gibi bir matris güç operatörüne sahip değildir.


Aslında, %^%paket expmiçinde -5 bayt için izin verecek şekilde düzgün bir şekilde uygulanmış bir operatör var , ancak ne yazık ki, TIO'da mevcut değil (yerel olarak test etmek zorunda kaldım).
Kirill L.

@KirillL. evet, bunu düşünmüştüm ama bence baz R tepkime sadık kalacağım. Ayrıca, tüm pakete yüklemeyerek 60 bayta kadar golf oynayabilirsiniz:function(M,N)sum(diag(expm::`%^%`(outer(0:M,0:M,"+")<=M,N)))
Giuseppe
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.