Tâche
Étant donné deux nombres entiers d
et n
, trouvez le nombre de façons d'exprimer n
une somme de d
carrés. C'est-à- n == r_1 ^2 + r_2 ^2 + ... + r_d ^2
dire que tel r_m
est un entier pour tous les entiers 1 ≤ m ≤ d
. Notez que l'échange de deux valeurs différentes (par exemple r_1
et r_2
) est considéré comme différent de la solution d'origine.
Par exemple, le nombre 45 peut être écrit comme une somme de 2 carrés de 8 manières différentes:
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
Règles
- Les solutions intégrées sont autorisées mais non concurrentes (ahem, Mathematica )
- Les failles standard sont également interdites.
- Les entrées peuvent être inversées.
Exemple d'E / S
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
C'est du code-golf , donc les soumissions utilisant le moins d'octets gagnent!
code-golf
number
number-theory
combinatorics
JungHwan Min
la source
la source
1, 0
cas de test, il y a1
moyen d'exprimer0
comme une somme de1
carrés:0 == 0^2
.Réponses:
Python 3 , 125 octets
Essayez-le en ligne!
Termine le dernier boîtier de test en 0,078 s. La complexité naïve est O ( d n 2 ).
la source
Mathematica, 8 octets, sans compétition
la source
Gelée , 9 octets
Essayez-le en ligne!
Prend
n
etd
dans cet ordre.la source
MATL , 13 octets
Les entrées sont
n
doncd
. Certains cas de test manquent de mémoire.Essayez-le en ligne!
Explication
Tenez compte des entrées
17
,3
.la source
Haskell , 43 octets
Juste votre récursion de base. Définit une fonction d'infixe binaire
#
. Essayez-le en ligne!Explication
Si
d == 0
etn /= 0
, nous sommes dans le deuxième cas, et la conditiond>0
fait que la liste est vide. La somme de la liste vide est 0, ce qui est la sortie correcte dans ce cas.la source
Pari / GP , 31 octets
Essayez-le en ligne!
la source
05AB1E , 10 octets
Prend les arguments comme n, puis d. A des problèmes pour résoudre les plus gros cas de test.
Essayez-le en ligne!
Explication
la source
Gelée , 23 octets
Essayez-le en ligne!
Port de ma solution Python . Termine le dernier testcase en 2.977 s.
la source
Mathematica, 38 octets
Pure fonction de prendre les entrées dans l'ordre
n
,d
.Range[-#,#]^2
donne l'ensemble de tous les carrés éventuellement pertinents, avec des carrés positifs énumérés deux fois pour rendre le décompte correct;Tuples[...,#2]
produit lesd
-tuples de ces carrés;Tr/@
somme chaqued
-tuple; etCount[...,#]
compte combien de résultats sont égauxn
.Les premiers cas de test se terminent rapidement, mais j'estime qu'il faudrait environ six mois pour exécuter le cas de test
1000,4
. Le remplacementRange[-#,#]
par le (plus long mais) plus sensibleRange[-Floor@Sqrt@#,Floor@Sqrt@#]
accélère ce calcul à environ 13 secondes.la source
Mathematica,
5351 octetsla source
Python 2, 138
Solution très inefficace avec mon bien-aimé eval. Pourquoi pas?
Essayez-le en ligne
Il a généré et évalue du code comme ceci:
Donc, pour certains gros d, il fonctionnera très longtemps et consommera beaucoup de mémoire, avec une complexité de O (n ^ d)
la source
k , 23 octets
Essayez-le en ligne! C'est un simple forceur brutal.
la source
Pyth - 16 octets
Essayez-le
C'est horriblement inefficace
la source