class c{long[]u={1,4,11,21,35,52,74,102,136,172,212,257,306,354,400,445,488,529,563,587,595,592,584,575,558,530,482,421,354,292,232,164,85,0,-85,-164,-232,-292,-354,-421,-482,-530,-558,-575,-584,-592,-595,-587,-563,-529,-488,-445,-400,-354,-306,-257,-212,-172,-136,-102,-74,-52,-35,-21,-11,-4,-1},v={0,0,0,0,0,0,0,0,0,0,0,0,-1,0,-1,0,-1,0,0,0,0,0,0,0,-1,0,1,0,1,0,1,0,0,0,0,0,1,0,1,0,1,0,-1,0,0,0,0,0,0,0,-1,0,-1,0,-1,0,0,0,0,0,0,0,0,0,0,0,1},w={1,0,0,-1,5};long d=1,e=1;void f(long a,long b){long[]U=u,V=v,W,X;while(a-->0){U=g(U);w=h(v,w);}W=h(v,U);while(b-->0){V=g(V);v=h(v,v);}X=h(V,u);if(w[0]!=v[0]){int i,j,k=0;u=new long[i=(i=W.length)>(j=X.length)?i:j];for(;k<i;k++)u[k]=(k<i?W[k]:0)-(k<j?X[k]:0);d*=e++;}}long[]g(long[]y){int s=y.length,i=1;long[]Y=new long[s-1];for(;i<s;){Y[i-1]=y[i]*i++;}return Y;}long[]h(long[]x,long[]y){int q=x.length,r=y.length,i=0,j;long[]z=new long[q+r-1];for(;i<q;i++)if(x[i]!=0)for(j=0;j<r;)z[i+j]+=x[i]*y[j++];return z;}c(){f(3,0);System.out.println(u[0]/d);}public static void main(String[]args){new c();}}
온라인으로 사용해보십시오!
크기가 12 인 숨겨진 문자열을 사용하여 해결할 수 있습니다 . 확실히 더 골프를 칠 수는 있지만 이것이 실제로 이길 방법은 없습니다. 난 그냥 번호 8008에 대한 존중에서 기여하고 싶었다.
참고 : 누군가가 시퀀스가 하드 코딩되었다고 불평하기 전에이를 하드 코딩과 다른 첫 번째 용어 (13 번째 = 307)까지 테스트했으며 천천히 느리게 가져옵니다. 이것이 long
대신 대신 사용 하는 이유이기도합니다 int
. 그렇지 않으면 해당 용어 이전에 오버플로됩니다.
업데이트 (2019 년 7 월 12 일) : 성능이 약간 향상되었습니다. 내 컴퓨터에서 5 분 대신 30 초 만에 13 번째 기간을 계산합니다.
업데이트 (2019 년 7 월 17 일) : g
함수의 루프 범위에서 버그가 수정되었으며 함수의 하단에서 배열 길이 범위가 수정되었습니다 f
. 이러한 버그는 결국 문제를 일으켰지 만 출력을 확인하여 빨리 발견 할 수는 없었습니다. 두 경우 모두, 게임에 5 일 동안 이러한 버그가 존재하면 일부 사람들이이 퍼즐을 풀지 못하는 데 혼란을 겪었을 수 있으므로이 제출에 대해 7 월 24 일까지 "안전한"마감일을 연장하는 것이 좋습니다.
업데이트 (2019 년 7 월 18 일) : 일부 테스트 후 오버 플로우가 순서대로 4 번째 용어 이후에 시작되어 19 번째 용어 이후 출력의 유효성에 영향을 미치는 것을 확인했습니다. 또한 여기에 기록 된 프로그램에서 각 연속 항은 계산하는 데 이전보다 약 5 배 더 오래 걸립니다. 제 15 학기는 컴퓨터에서 약 14 분이 걸립니다. 따라서 실제로 작성된대로 프로그램을 사용하여 19 번째 용어를 계산하는 데 6 일이 걸립니다.
또한 깔끔한 간격 / 들여 쓰기가있는 코드가 있으므로 자동 서식 기능이있는 IDE가없는 경우 읽기가 더 쉽습니다.
class c {
long[] u = {1, 4, 11, 21, 35, 52, 74, 102, 136, 172, 212, 257, 306, 354, 400, 445, 488, 529, 563, 587, 595, 592, 584,
575, 558, 530, 482, 421, 354, 292, 232, 164, 85, 0, -85, -164, -232, -292, -354, -421, -482, -530, -558, -575,
-584, -592, -595, -587, -563, -529, -488, -445, -400, -354, -306, -257, -212, -172, -136, -102, -74, -52, -35,
-21, -11, -4, -1},
v = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0,
0, 1, 0, 1, 0, 1, 0, -1, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1},
w = {1, 0, 0, -1, 5};
long d = 1, e = 1;
void f(long a, long b) {
long[] U = u, V = v, W, X;
while (a-- > 0) {
U = g(U);
w = h(v, w);
}
W = h(v, U);
while (b-- > 0) {
V = g(V);
v = h(v, v);
}
X = h(V, u);
if (w[0] != v[0]) {
int i, j, k = 0;
u = new long[i = (i = W.length) > (j = X.length) ? i : j];
for (; k < i; k++)
u[k] = (k < i ? W[k] : 0) - (k < j ? X[k] : 0);
d *= e++;
}
}
long[] g(long[] y) {
int s = y.length, i = 1;
long[] Y = new long[s - 1];
for (; i < s;) {
Y[i - 1] = y[i] * i++;
}
return Y;
}
long[] h(long[] x, long[] y) {
int q = x.length, r = y.length, i = 0, j;
long[] z = new long[q + r - 1];
for (; i < q; i++)
if (x[i] != 0)
for (j = 0; j < r;)
z[i + j] += x[i] * y[j++];
return z;
}
c() {
f(3, 0);
System.out.println(u[0] / d);
}
public static void main(String[] args) {
new c();
}
}
해결책
f(1,v[0]=1);
바로 전에 System.out.println
원래의 기능을 다항식으로 표현의 몫은 0에서 n 번째 테일러 확장 계수를 계산함으로써 프로그램 작품 u
과 v
내가로부터 취득한 여기 분모가 밖으로 곱하지 않는 링크 된 문서에서 제외하고, 테일러 시리즈를 계산해야한다고 말하는 곳은 없습니다. 우연히 그 문제를 발견 한 다음 다른 출처를 통해 확인했습니다.
미분에 대한 몫 규칙을 반복적으로 적용하여 계산이 수행됩니다.
의 잘못된 첫 번째 용어 v
, 전체 배열 w
및 f
인수가 있는 함수와 같은 몇 가지 다른 것들이 사람들을 혼란스럽게 만듭니다.