만드는 중입니다

아직 만드는 중이라 바뀔 수 있습니다

함수 세기

시간 제한2초메모리 제한512 MB

요약
절댓값이 n 이하인 정수 집합에서 f를 k번 적용하면 모든 x가 -x가 되고, |f(x)|와 |x|의 차가 2 이하인 함수 f의 개수를 구합니다. 답은 10^9+7로 나눈 나머지로 출력합니다.
난이도

어려움10점 중 9점

유형
조합론, 동적 계획법, 수학
정답자
아직 제출이 없습니다

문제

정수 nn에 대해 절댓값이 nn 이하인 정수들의 집합을 M={x∈Z:∣x∣≤n}M = \{ x \in \mathbb{Z} : |x| \le n \}라고 하자.

fk(x)f_k(x)는 초깃값 xx에 함수 ff를 kk번 적용한 값이다. 즉, f0(x)=xf_0(x) = x이고, 임의의 i≥1i \ge 1에 대해 fi(x)=f(fi−1(x))f_i(x) = f(f_{i-1}(x))이다.

정수 nn과 kk가 주어질 때, 다음 조건을 모두 만족하는 함수 f(x)f(x)의 개수를 구하라.

  1. f:M→Mf: M \to M
  2. ∀x∈M:fk(x)=−x\forall x \in M: f_k(x) = -x
  3. ∀x∈M:∣∣f(x)∣−∣x∣∣≤2\forall x \in M: \big| |f(x)| - |x| \big| \le 2

답이 매우 클 수 있으므로 109+710^9 + 7로 나눈 나머지를 출력한다.

입력

첫 줄에 테스트 케이스의 개수 TT가 주어진다 (1≤T≤1001 \le T \le 100).

각 테스트 케이스는 양의 정수 nn과 kk의 쌍으로 주어진다 (n⋅k≤109n \cdot k \le 10^9).

모든 테스트 케이스에 대한 n⋅kn \cdot k의 합은 4⋅1094 \cdot 10^9를 넘지 않는다.

출력

각 테스트 케이스마다 답을 109+710^9 + 7로 나눈 나머지를 한 줄에 출력한다.

힌트

k=1k = 1이면 조건을 모두 만족하는 함수는 f(x)=−xf(x) = -x뿐이다.

n=k=2n = k = 2이면 조건을 만족하는 함수는 두 개 있다.

  • (−2,−1,0,1,2)→(1,−2,0,2,−1)(-2, -1, 0, 1, 2) \to (1, -2, 0, 2, -1)
  • (−2,−1,0,1,2)→(−1,2,0,−2,1)(-2, -1, 0, 1, 2) \to (-1, 2, 0, -2, 1)

예제1

  1. 예제 1

    입력
    7
    1 1
    2 1
    100 1
    1 2
    2 2
    3 2
    20 4
    
    예상 출력
    1
    1
    1
    0
    2
    0
    1048576