처음 n개의 자연수가 있는 배열 A가 있다고 가정합니다. A에서 정확히 k개의 인접 스왑 후에 얻을 수 있는 시퀀스(S1)의 수를 찾아야 합니까? 그리고 A에서 기껏해야 k 스왑 후에 몇 개의 시퀀스(S2)를 얻을 수 있습니까? 여기서 인접 스왑은 인덱스 i와 i+1의 요소를 바꾸는 것을 의미합니다.
따라서 입력이 n =3 k =2와 같으면 출력은 -
이기 때문에 3, 6이 됩니다.원래 배열은 [1, 2, 3]
입니다.- 2번의 인접한 스왑 후:[1, 2, 3], [2, 3, 1], [3, 1, 2]를 얻을 수 있으므로 S1 =3
- 최대 2번의 교환 후:
- 0 스왑 후:[1, 2, 3]
- 1회 교환 후:[2, 1, 3], [3, 2, 1], [1, 3, 2].
- 2번의 교환 후:[1, 2, 3], [2, 3, 1], [3, 1, 2]
따라서 S2 =6
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
- p =10^9+7
- A :=요소가 하나만 있는 배열 1
- C :=요소가 하나만 있는 배열 1
- 2~n+1 범위의 n에 대해
- B :=A, A :=요소가 하나만 있는 배열 1
- D :=C, C :=요소가 하나만 있는 배열 1
- 범위 1에서 (k+1 및 1에서 n까지의 모든 숫자의 합) 최소값까지 x의 경우
- insert(A의 마지막 요소 + (B[x] 일 때 x
- 1에서 n-2 사이의 x에 대해 다음을 수행합니다.
- C 끝에 ((D[x]+(n-1)*D[x-1]) mod p) 삽입
- C 끝에 (n * D의 마지막 요소) mod p 삽입
- A[인덱스 k mod 2에서 k까지]) mod p 및 C[n-1 및 k의 최소값]의 모든 요소의 합을 반환
예시
이해를 돕기 위해 다음 구현을 살펴보겠습니다. −
p = 10**9+7 def solve(n, k): A = [1] C = [1] for n in range(2,n+1): B = A A = [1] D = C C = [1] for x in range(1,min(k+1,n*(n-1)//2+1)): A.append((A[-1] + (B[x] if x<len(B) else 0) - (B[x-n] if 0<=x-n else 0)) % p ) for x in range(1,n-1): C.append((D[x]+(n-1)*D[x-1]) % p) C.append(n*D[-1] % p) return sum(A[k%2:k+1:2]) % p,C[min(n-1,k)] n = 3 k = 2 print(solve(n, k))
입력
3, 2
출력
3, 6