관심이없는 나는 프로젝트 오일러의 "최근"카테고리 ( 디지트 섬 시퀀스 ) 에서 문제를 해결하려고했습니다 . 그러나 문제를 효율적으로 해결하는 방법을 생각할 수 없습니다. 문제는 다음과 같습니다 (원래 질문 순서에는 처음에 두 가지가 있지만 순서는 변경되지 않습니다).
Digit Sum 시퀀스는 1,2,4,8,16,23,28,38,49 ....입니다. 여기서 시퀀스의 항은 시퀀스 에서 앞에 오는 자릿수 입니다. 시퀀스 의 항을 찾습니다 .
순진한 솔루션은 시간이 많이 걸리므로 구현할 수 없습니다. 행렬 지수의 경우로 문제를 줄이기 위해 노력했습니다 ( 시간했지만이 순서에 대한 재발은 선형 기준에 맞는 재발을 얻을 수 없었습니다. 독특한. 시퀀스가 재발에 의해 지배되는 것을 볼 수 있습니다.
여기서 은 시퀀스의 n t h 항이고 d 는 입력으로서 자연수를 주었을 때 숫자의 자릿수를 반환하는 함수입니다 (예 : ). 두 번째 방법은 시퀀스에서 패턴을 찾는 것입니다. 시퀀스의 처음 몇 항은 다음과 같이 쓸 수 있음을 알 수 있습니다
a_1 = 1
a_2 = 1 + d( 1 )
a_3 = 1 + d( 1 ) + d( 1 + d( 1 ) )
a_4 = 1 + d( 1 ) + d( 1 + d( 1 ) ) + d( 1 + d( 1 ) + d( 1 + d( 1 ) ) )
a_5 = 1 + d( 1 ) + d( 1 + d( 1 ) ) + d( 1 + d( 1 ) + d( 1 + d( 1 ) ) ) + d( 1 + d(
1 ) + d( 1 + d( 1 ) ) + d( 1 + d( 1 ) + d( 1 + d( 1 ) ) ) )
위 패턴 에서 시퀀스의 항은 다음 방법으로 생성 할 수 있습니다.
- 사이에 더하기 기호가있는 1을 쓰십시오 .
- 제두면 다음 함수 적용 (D)를 다음에 2 개 0 다음에 다음 조건 (2 개) (1) 다음에 그리고, 조건 조건 등등.
- 그런 다음 위의 방법을 각 인수에 반복적으로 적용하십시오. 적용된 d 함수의적용하십시오.
예를 들어 n = 3이면 다음 조작을 수행합니다.
1 + 1 + 1 + 1 + 1 + 1 + 1 + 1
1 + d( 1 ) + d( 1 + 1 ) + d( 1 + 1 + 1 + 1 )
1 + d( 1 ) + d( 1 + d(1) ) + d( 1 + d( 1 ) + d( 1 +d( 1 ) ) )
동적 프로그래밍으로 I는 생성 할 수 시간에 상기 방법을 이용하여 항 O ( L를 O g ( 2 10 15 ) ) , 또 더 나은 솔루션보다 순진한된다.
편집 1
관찰 할 수있는 또 다른 것은 입니다. 예를 들어 D ( 6 ) = D는 ( 23 ) = D는 ( 32 ) = 5 . 그러나 나는이 시점을 이용할 수 없습니다. 다시 선형 재귀 관계 (매트릭스 지수의 경우)를 찾으려고했지만 찾을 수 없습니다.
편집 2
다음은 서열이 더 작은 범위에 대해 플롯 될 때의 그래프입니다 (시퀀스의 처음 항이 플롯 됨).
추신 : Project Euler에게 솔루션을 요청하는 것은 바람직하지 않다는 것을 알고 있습니다. 그러나 나는 지난 몇 일 동안 서클에서 움직여 왔기 때문에 새로운 방향이나 힌트를 원합니다. 그것도 받아 들일 수 없다면 제안 된 경우 질문을 제거 할 수 있습니다.
You are given a106 = 31054319.
원래 오일러 문제에서 힌트가 된 것 같습니다 .