숫자를 제곱의 합계로 쓰는 방법은 몇 가지입니까?


12

직무

두 개의 정수 d와가 주어지면 제곱 의 합으로 n표현할 수있는 방법의 수를 찾으십시오 . 즉, 같은 그 모든 정수의 정수입니다 . 서로 다른 두 값 (예 : 및 ) 을 바꾸는 것은 원래 솔루션과 다른 것으로 간주됩니다.ndn == r_1 ^2 + r_2 ^2 + ... + r_d ^2r_m1 ≤ m ≤ dr_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은 d가 아닌 0입니다.
Leaky Nun

1
@DeadPossum 1, 0테스트 케이스의 경우 제곱 의 합으로 1표현하는 방법이 있습니다. 010 == 0^2
JungHwan Min

답변:



5

수학, 8 바이트, 비경쟁

SquaresR

3
이것처럼 필요했습니다 ... 질문에 새로운 것을 추가하지 않았습니다. : P
Outgolfer Erik

@EriktheOutgolfer 질문을 비난; 명시 적으로 허용된다고 명시되어 있습니다.
JollyJoker

D : 비 내장 솔루션 그 순간 거의 내장 된 솔루션을 이길
데이비드 멀더를

@JollyJoker 내 요점은, 답변이 질문 무언가를 추가 해야한다는 것입니다. 그렇지 않으면 왜 게시해야합니까? *
shrug

@DavidMulder 나는 처음에 "거의"그리워하고 약간 충격을 받았다 ...
Outgolfer Erik


4

MATL , 13 바이트

y_t_&:Z^U!s=s

입력은 n다음 d. 테스트 사례 중 일부에 메모리가 부족합니다.

온라인으로 사용해보십시오!

설명

입력을 고려 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

하스켈 , 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

수학, 38 바이트

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

순서대로 입력을 복용 순수 기능 n, d. Range[-#,#]^2카운트를 올바르게하기 위해 양의 제곱을 두 번 나열하여 가능한 모든 관련 제곱 세트를 제공합니다. 그러한 사각형 Tuples[...,#2]d튜플을 생성합니다 . Tr/@d튜플을 합산합니다 . 그리고 Count[...,#]얼마나 많은 결과가 같은지 계산합니다 n.

처음 몇 가지 테스트 사례는 빠르게 종료되지만 테스트 사례를 실행하는 데 약 반 년이 걸릴 것으로 예상 1000,4됩니다. Range[-#,#]더 길지만 더 현명한 것으로 교체 Range[-Floor@Sqrt@#,Floor@Sqrt@#]하면 계산 속도가 약 13 초로 빨라집니다.



1

파이썬 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)의 복잡성을 갖습니다.



당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.