有几种方法可以将数字写成平方和?


12

任务

给定两个整数dn,找到表示nd平方和的方式数。也就是说,,对于所有整数n == r_1 ^2 + r_2 ^2 + ... + r_d ^2r_m都是一个整数1 ≤ m ≤ d。请注意,交换两个不同的值(例如r_1r_2)被认为与原始解决方案不同。

例如,数字45可以写为2平方和的8种不同方式:

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

规则

  • 允许使用内置解决方案,但不能与之竞争(Ahem,Mathematica
  • 也禁止出现标准漏洞。
  • 输入可以颠倒。

示例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

这是,因此使用最少字节的提交会获胜!


为什么删除帖子并发布新帖子,同时又可以编辑删除的帖子?
Leaky Nun

@LeakyNun当我尝试对其进行编辑时,甚至在删除它之前,我的浏览器都发生了错误。
JungHwan Min


1
不,n是0,不是d。
Leaky Nun

1
@DeadPossum对于1, 0测试用例,有一种1方法可以表示01平方和:0 == 0^2
JungHwan Min

Answers:


7

Python 3,125个字节

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

在线尝试!

在0.078秒内完成最后一个测试用例。天真的复杂度是O(d n 2)。


5

Mathematica,8字节,无竞争

SquaresR

3
这样甚至是需要的...不会在问题中添加任何新内容。:P
暴民埃里克(Erik the Outgolfer)

@EriktheOutgolfer怪问题;它明确声明了允许的。
JollyJoker

那些非内置解决方案几乎击败内置解决方案的时刻:D
David Mulder

@JollyJoker我的意思是,答案应该为问题添加一些内容,否则为什么还要发布它们?*耸肩*:P
Outgolfer的埃里克

@DavidMulder我起初很想念“差点”,感到有些震惊……
Outgolfer的Erik


4

MATL,13字节

y_t_&:Z^U!s=s

输入是n,然后d。一些测试用例内存不足。

在线尝试!

说明

考虑输入173

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个字节

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

只是您的基本递归。定义一个二进制中缀函数#在线尝试!

说明

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.

如果d == 0n /= 0,则在第二种情况下,并且条件d>0导致列表为空。空列表的总和为0,在这种情况下,这是正确的输出。



2

05AB1E,10个字节

Ð(Ÿ²ã€nOQO

将参数取为n,然后取d。解决较大的测试用例时遇到问题。

在线尝试!

说明

Ð(Ÿ²ã€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个字节

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

纯函数取输入的顺序ndRange[-#,#]^2给出所有可能相关的平方的集合,其中两次列出正数以使计数正确;Tuples[...,#2]产生d这样的正方形的元组;Tr/@对每个元组d求和;并Count[...,#]计算多少个结果相等n

前几个测试用例很快终止,但是我估计这将花费半年左右的时间来运行该测试用例1000,4Range[-#,#](更长但更明智的)替换Range[-Floor@Sqrt@#,Floor@Sqrt@#]将计算速度提高到大约13秒。


1

Mathematica,53 51字节

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

1

Python 2,138

我心爱的评估版的解决方案效率低下。为什么不?
在线尝试

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

它生成并评估如下代码:

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

因此,对于某个较大的d,它将运行很长时间并消耗大量内存,且复杂度为O(n ^ d)



By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.