Sayıları karelerin toplamı olarak yazmanın kaç yolu var?


12

Görev

İki tamsayı verildiğinde dve karelerin toplamı olarak nifade etmenin yollarını bulun . Olduğunu, , öyle ki bütün tamsayılar için bir tam sayıdır . İki farklı değerin (ör. Ve ) değiştirilmesinin , orijinal çözümden farklı olduğu kabul edilir.ndn == r_1 ^2 + r_2 ^2 + ... + r_d ^2r_m1 ≤ m ≤ dr_1r_2

Örneğin, 45 sayısı 8 farklı yolla 2 kare toplamı olarak yazılabilir:

45
== (-6)^2 + (-3)^2
== (-6)^2 + 3^2
== (-3)^2 + (-6)^2
== (-3)^2 + 6^2
== 3^2 + (-6)^2
== 3^2 + 6^2
== 6^2 + (-3)^2
== 6^2 + 3^2

kurallar

  • Yerleşik çözümlere izin verilmektedir ancak rakip değildir (ahem, Mathematica )
  • Standart boşluklar da yasaktır.
  • Girişler ters çevrilebilir.

Örnek G / Ç

In:   d, n

In:   1, 0
Out:  1

In:   1, 2
Out:  0

In:   2, 2
Out:  4

In:   2, 45
Out:  8

In:   3, 17
Out:  48

In:   4, 1000
Out:  3744

In:   5, 404
Out:  71440

In:   11, 20
Out:  7217144

In:   22, 333
Out:  1357996551483704981475000

Bu , bu yüzden en az bayt kullanarak gönderme kazanmak!


Neden sildin bu sildiğiniz yazıyı düzenleyebilirsiniz iken ve yeni bir tane yayınlanmıştır?
Leaky Nun

@LeakyNun Tarayıcıyı silmeden önce bile düzenlemeye çalıştığımda hatalar attı.
JungHwan Min


1
Hayır, n 0, d değil.
Leaky Nun

1
İçin @DeadPossum 1, 0test durumu vardır 1ifade etmek yolu 0toplamı olarak 1kare: 0 == 0^2.
JungHwan Min

Yanıtlar:


7

Python 3 , 125 bayt

n,d=eval(input())
W=[1]+[0]*n
exec("W=[sum(-~(j>0)*W[i-j*j]for j in range(int(i**.5)+1))for i in range(n+1)];"*d)
print(W[n])

Çevrimiçi deneyin!

Son test kutusunu 0.078 sn'de bitirir. Naif karmaşıklığı O (bir d , n 2 ).


5

Mathematica, 8 bayt, rakip olmayan

SquaresR

3
Bunun bile gerekli olduğu gibi ... soruya yeni bir şey eklemez. : P
Erik Outgolfer

@EriktheOutgolfer Soruyu suçla; açıkça izin verildiğini belirtir.
JollyJoker

Yerleşik olmayan çözümlerin neredeyse yerleşik çözümleri yendiği anlar: D
David Mulder

@JollyJoker Demek istediğim, cevaplar soruya bir şeyler eklemelidir , aksi halde neden onları gönderesiniz ? * omuz silkme *: P
Erik Outgolfer

@DavidMulder İlk başta "neredeyse" özledim ve biraz şok oldu ...
Erik the Outgolfer


4

MATL , 13 bayt

y_t_&:Z^U!s=s

Girdiler no zaman d. Bazı test senaryolarında bellek kalmadı.

Çevrimiçi deneyin!

açıklama

Girişlerini düşünün 17, 3.

y     % Implicit inputs. Duplicate from below
      % STACK: 17, 3, 17
_     % Negate
      % STACK: 17, 3, -17
t_    % Duplicate. Negate
      % STACK: 17, 3, -17, 17
&:    % Two-input range
      % STACK: 17, 3, [-17 -16 ... 17]
Z^    % Cartesian power. Gives a matrix where each Cartesian tuple is a row
      % STACK: 17, [-17 -17 -17; -17 -17 -16; ...; 17 17 17]
U     % Square, element-wise
      % STACK: 17, [289 289 289; 289 289 256; ...; 289 289 289]
!s    % Transpose. Sum of each column
      % STACK: 17, [867 834 ... 867]
=     % Equals?, element-wise
      % STACK: 17, [0 0 ... 0] (there are 48 entries equal to 1 in between)
s     % Sum. Implicit display
      % STACK: 48

3

Haskell , 43 bayt

0#0=1
d#n=sum[(d-1)#(n-k*k)|d>0,k<-[-n..n]]

Sadece temel özyinelemeniz. İkili bir infix işlevini tanımlar #. Çevrimiçi deneyin!

açıklama

0#0=1            -- If n == d == 0, give 1.
d#n=             -- Otherwise,
 sum[            -- give the sum of
  (d-1)#(n-k*k)  -- these numbers
  |d>0,          -- where d is positive
   k<-[-n..n]]   -- and k is between -n and n.

Eğer d == 0ve n /= 0, ikinci durumdaysak ve koşul d>0listenin boş olmasına neden olur. Boş listenin toplamı, bu durumda doğru çıktı olan 0'dır.



2

05AB1E , 10 bayt

Ð(Ÿ²ã€nOQO

Tartışmaları n, sonra d olarak alır. Daha büyük test senaryolarını çözmede problemler var.

Çevrimiçi deneyin!

açıklama

Ð(Ÿ²ã€nOQO   Arguments n, d
Ð            Triplicate n on stack
 (           Negate n
  Ÿ          Range: [-n ... n]
   ²ã        Caertesian product of length d
     €n      Square each number
       OQ    Sum of pair equals n
         O   Total sum (number of ones)


2

Mathematica, 38 bayt

Count[Tr/@Tuples[Range[-#,#]^2,#2],#]&

Sırayla girdileri alarak Saf fonksiyon n, d. Range[-#,#]^2sayımı doğru yapmak için iki kez listelenen pozitif karelerle birlikte tüm ilgili karelerin kümesini verir; bu tür karelerin tupellerini Tuples[...,#2]üretir d; Tr/@her bir dtoplamı; ve Count[...,#]sonuçların kaç tanesinin eşit olduğunu sayar n.

İlk birkaç test vakası hızlı bir şekilde sona erer, ancak bunun test vakası üzerinde çalışmasının yaklaşık yarım yıl alacağını tahmin ediyorum 1000,4. Değiştirme Range[-#,#](uzun ama) daha mantıklı tarafından Range[-Floor@Sqrt@#,Floor@Sqrt@#]13 saniyede yaklaşık bu hesaplama kadar hızlarda.


1

Mathematica, 53 51 bayt

SeriesCoefficient[EllipticTheta[3,0,x]^#,{x,0,#2}]&

1

Python 2, 138

Sevgili eval ile çok verimsiz bir çözüm. Neden olmasın?
Çevrimiçi deneyin

lambda n,d:d and 4*eval(eval("('len({('+'i%s,'*d+'0)'+'for i%s in range(n)'*d+'if '+'i%s**2+'*d+'0==n})')%"+`tuple(range(d)*3)`),locals())

Aşağıdaki gibi kod üretti ve değerlendirdi:

len({(i0,i1,0)for i0 in range(n)for i1 in range(n)if i0**2+i1**2+0==n})

Bu yüzden bazı büyük d için çok uzun sürecek ve O (n ^ d) karmaşıklığına sahip çok fazla bellek tüketecek



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.