Berapa banyak cara untuk menulis angka sebagai jumlah kuadrat?

12

Tugas

Diberi dua bilangan bulat ddan n, temukan jumlah cara untuk mengekspresikan nsebagai jumlah dkuadrat. Artinya n == r_1 ^2 + r_2 ^2 + ... + r_d ^2, sedemikian rupa sehingga r_mmerupakan bilangan bulat untuk semua bilangan bulat 1 ≤ m ≤ d. Perhatikan bahwa menukar dua nilai yang berbeda (misalnya r_1dan r_2) dianggap berbeda dari solusi asli.

Misalnya, angka 45 dapat ditulis sebagai jumlah 2 kotak 8 cara yang berbeda:

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

Aturan

  • Solusi bawaan diizinkan tetapi tidak bersaing (ahem, Mathematica )
  • Celah standar juga dilarang.
  • Input dapat dibalik.

Contoh I / O

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

Ini adalah , jadi pengiriman menggunakan byte paling sedikit menang!

JungHwan Min
sumber
Mengapa Anda menghapus ini dan memposting yang baru sementara Anda dapat mengedit posting yang Anda hapus?
Leaky Nun
@ LeakyNun Browser saya membuat kesalahan ketika saya mencoba mengeditnya, bahkan sebelum menghapusnya.
JungHwan Min
Terkait
Luis Mendo
1
Tidak, n adalah 0, bukan d.
Leaky Nun
1
@DeadPossum Untuk 1, 0kasus uji, ada 1cara untuk mengungkapkan 0sebagai jumlah dari 1persegi: 0 == 0^2.
JungHwan Min

Jawaban:

7

Python 3 , 125 byte

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])

Cobalah online!

Selesai testcase terakhir dalam 0,078 dtk. Kompleksitas naif adalah O ( d n 2 ).

Biarawati Bocor
sumber
5

Mathematica, 8 byte, tidak bersaing

SquaresR
alephalpha
sumber
3
Seperti ini bahkan diperlukan ... tidak menambahkan sesuatu yang baru ke pertanyaan. : P
Erik the Outgolfer
@EriktheOutgolfer Salahkan pertanyaannya; menyatakan secara eksplisit diizinkan.
JollyJoker
Saat-saat di mana solusi non-built-in hampir mengalahkan solusi built-in: D
David Mulder
@JollyJoker Maksud saya adalah, jawaban harus menambahkan sesuatu ke pertanyaan, jika tidak, mengapa bahkan mempostingnya? * mengangkat bahu *: P
Erik the Outgolfer
@ Davidvidul Saya pada awalnya melewatkan "hampir" dan terkejut sedikit ...
Erik the Outgolfer
5

Jelly , 9 byte

Nr⁸²ṗS€ċ⁸

Cobalah online!

Mengambil ndan ddalam urutan ini.

Erik the Outgolfer
sumber
Berapa tahun yang dibutuhkan untuk testcase terakhir?
Leaky Nun
@ LeakyNun Saya tidak tahu, itu di luar pemahaman saya ...
Erik the Outgolfer
4

MATL , 13 byte

y_t_&:Z^U!s=s

Inputnya n, lalu d. Beberapa kasus uji kehabisan memori.

Cobalah online!

Penjelasan

Pertimbangkan input 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
Luis Mendo
sumber
3

Haskell , 43 byte

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

Hanya rekursi dasar Anda. Menentukan fungsi infiks biner #. Cobalah online!

Penjelasan

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.

Jika d == 0dan n /= 0, kita berada dalam kasus kedua, dan kondisi ini d>0menyebabkan daftar menjadi kosong. Jumlah daftar kosong adalah 0, yang merupakan output yang benar dalam kasus ini.

Zgarb
sumber
2

05AB1E , 10 byte

Ð(Ÿ²ã€nOQO

Mengambil argumen sebagai n, lalu d. Memiliki masalah dalam menyelesaikan kasus uji yang lebih besar.

Cobalah online!

Penjelasan

Ð(Ÿ²ã€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)
kalsowerus
sumber
2

Jelly , 23 byte

‘ṬUµJ²fJ[0]ẋ;€ḤSḣL+µ⁹¡Ṫ

Cobalah online!

Port solusi Python saya . Selesai testcase terakhir dalam 2,977 dtk.

Biarawati Bocor
sumber
2

Mathematica, 38 byte

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

Fungsi murni mengambil masukan dalam urutan n, d. Range[-#,#]^2memberikan himpunan semua kotak yang mungkin relevan, dengan kotak positif terdaftar dua kali untuk membuat hitungan benar; Tuples[...,#2]menghasilkan d-tupel kotak seperti itu; Tr/@jumlah masing-masing d-tupel; dan Count[...,#]menghitung berapa hasil yang sama n.

Beberapa kasus uji pertama berakhir dengan cepat, tetapi saya memperkirakan ini akan memakan waktu sekitar setengah tahun untuk menjalankan kasus uji 1000,4. Mengganti Range[-#,#]dengan (lebih lama tapi) lebih masuk akal Range[-Floor@Sqrt@#,Floor@Sqrt@#]mempercepat perhitungan itu menjadi sekitar 13 detik.

Greg Martin
sumber
1

Mathematica, 53 51 byte

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

Python 2, 138

Solusi yang sangat tidak efisien dengan eval tercinta. Kenapa tidak?
Cobalah online

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())

Ini menghasilkan dan mengevaluasi kode seperti ini:

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

Jadi untuk beberapa d besar itu akan berjalan sangat lama dan mengkonsumsi banyak memori, memiliki kompleksitas O (n ^ d)

Possum Mati
sumber
1

k , 23 byte

{+/y=+/{x*x}y-!x#1+2*y}

Cobalah online! Ini pendorong kasar yang sederhana.

zgrep
sumber
1

Pyth - 16 byte

lfqQsm*ddT^}_QQE

Cobalah

Sangat tidak efisien

Maria
sumber