Tugas
Diberi dua bilangan bulat d
dan n
, temukan jumlah cara untuk mengekspresikan n
sebagai jumlah d
kuadrat. Artinya n == r_1 ^2 + r_2 ^2 + ... + r_d ^2
, sedemikian rupa sehingga r_m
merupakan bilangan bulat untuk semua bilangan bulat 1 ≤ m ≤ d
. Perhatikan bahwa menukar dua nilai yang berbeda (misalnya r_1
dan 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 kode-golf , jadi pengiriman menggunakan byte paling sedikit menang!
code-golf
number
number-theory
combinatorics
JungHwan Min
sumber
sumber
1, 0
kasus uji, ada1
cara untuk mengungkapkan0
sebagai jumlah dari1
persegi:0 == 0^2
.Jawaban:
Python 3 , 125 byte
Cobalah online!
Selesai testcase terakhir dalam 0,078 dtk. Kompleksitas naif adalah O ( d n 2 ).
sumber
Mathematica, 8 byte, tidak bersaing
sumber
Jelly , 9 byte
Cobalah online!
Mengambil
n
dand
dalam urutan ini.sumber
MATL , 13 byte
Inputnya
n
, lalud
. Beberapa kasus uji kehabisan memori.Cobalah online!
Penjelasan
Pertimbangkan input
17
,3
.sumber
Haskell , 43 byte
Hanya rekursi dasar Anda. Menentukan fungsi infiks biner
#
. Cobalah online!Penjelasan
Jika
d == 0
dann /= 0
, kita berada dalam kasus kedua, dan kondisi inid>0
menyebabkan daftar menjadi kosong. Jumlah daftar kosong adalah 0, yang merupakan output yang benar dalam kasus ini.sumber
Pari / GP , 31 byte
Cobalah online!
sumber
05AB1E , 10 byte
Mengambil argumen sebagai n, lalu d. Memiliki masalah dalam menyelesaikan kasus uji yang lebih besar.
Cobalah online!
Penjelasan
sumber
Jelly , 23 byte
Cobalah online!
Port solusi Python saya . Selesai testcase terakhir dalam 2,977 dtk.
sumber
Mathematica, 38 byte
Fungsi murni mengambil masukan dalam urutan
n
,d
.Range[-#,#]^2
memberikan himpunan semua kotak yang mungkin relevan, dengan kotak positif terdaftar dua kali untuk membuat hitungan benar;Tuples[...,#2]
menghasilkand
-tupel kotak seperti itu;Tr/@
jumlah masing-masingd
-tupel; danCount[...,#]
menghitung berapa hasil yang saman
.Beberapa kasus uji pertama berakhir dengan cepat, tetapi saya memperkirakan ini akan memakan waktu sekitar setengah tahun untuk menjalankan kasus uji
1000,4
. MenggantiRange[-#,#]
dengan (lebih lama tapi) lebih masuk akalRange[-Floor@Sqrt@#,Floor@Sqrt@#]
mempercepat perhitungan itu menjadi sekitar 13 detik.sumber
Mathematica,
5351 bytesumber
Python 2, 138
Solusi yang sangat tidak efisien dengan eval tercinta. Kenapa tidak?
Cobalah online
Ini menghasilkan dan mengevaluasi kode seperti ini:
Jadi untuk beberapa d besar itu akan berjalan sangat lama dan mengkonsumsi banyak memori, memiliki kompleksitas O (n ^ d)
sumber
k , 23 byte
Cobalah online! Ini pendorong kasar yang sederhana.
sumber
Pyth - 16 byte
Cobalah
Sangat tidak efisien
sumber