정의 S [N]를 {1, 2, ..., 서브 세트의 수가 N 더 연속적인 정수를 포함하지}. 각각의 경우 [N]을들 , 모든 경우 나 (1 ≤ i가 < N ) GCD ( S [I] , S [N]가 ) 1, 우리는 부르는 S [n]이 A와 프라임 S . 또한, S [1] 도이다 프라임 S . 를 들어 K 번째 최소 국무 S , 우리는 최소 찾으려면 S를 [N] 의 다중 인 X 댄 및 이하 K 번째 최소 국무 S. 우리에게 해당 (알려주세요 S [N] ÷의 X ) 모드 M을 .
입력
여러 테스트 케이스가 있습니다. 입력의 첫 번째 라인은 테스트 케이스의 수를 나타내는 정수 T이다.
테스트 케이스를 들어, 3의 정수가있는 K (1 ≤ K ≤ 10 6 ), X (3 ≤ X ≤ 100)와 M (10 ≤ M ≤ 10 (6) 상기의 설명에 정의되어있다).
<H4 <DD = ""> 출력
각 테스트 케이스하세요 대응 출력 ( S [N] ÷의 X ) 개조 M .
<H4 <DD = ""> 샘플 입력
1 1 3 10
<H4 <DD = ""> 예제 출력
1
해결책 :
원본 : HTTPS : //blog.csdn.net/zy691357966/article/details/44857739
2. Feibolaqi 특성
(FIB (N), FIB GCD (m)) = FIB (GCD (N, M)) ( 즉, 112,358 시퀀스의 시작으로부터 계산)
되도록 때만 GCD (N , m) = 1 또는 2 FIB [N] 및 FIB [m] 서로 소
S [N] = FIB [N + 2]
따라서, 만약 S [N]은 프라임이 경우
제 n + 2가 소수 또는 4이어야 특별한 4가 왜 자신의 페인트가 알 수
있도록 특별한 주요 테이블 구성
[I] 3 4 5 7 P를 11 (13) ...................
그러므로 K 소수가 FIB 인 [P [K]
3. X에 의해 숫자 나눌 수를 찾는 방법
FIB에서 [P [K]는 FIB의 시작 [P는 [K 것을 알아서] %의 X == 0의 개수에
기록 ANSI = 난;
4. 인용 합동 식
(a / b) % C = (a % (b *의 온도)) / B
계산에 따르면, ANSI
암호:
#INCLUDE <cstdio> #INCLUDE <cstdlib> #INCLUDE <CString을> #INCLUDE <ctime이> #INCLUDE <알고리즘> #INCLUDE <iostream> #INCLUDE <sstream> #INCLUDE <문자열> #DEFINE 각종 0x13131313 #DEFINE LL 긴 긴 사용하여 네임 스페이스 표준; CONST의 INT의 maxn = 16,000,001; INT K, X, M; INT P는 [2000001], TOT = 0; [maxn] YN BOOL; 구조체 노드 { LL 매트 [3] [3]; }; matmult 노드 (노드 A, 노드 B, INT 모드) { 노드 C; memset 함수 (c.mat, 0는 sizeof (c.mat)); 대 (INT J = 1; J <= 2, J ++) 대 (INT K = 1; K <= 2; ++ K) c.mat [I] [J 위해 (I ++; 나는 = 2 <I = 1 INT)을 = (c.mat [I] [J] + a.mat [I] [K] * b.mat [K] [J]) %의 모드; } 노드 quickmatpow는 (노드 A는 N INT 개조 INT) { 노드 C를; memset 함수 (c.mat, 0는 sizeof (c.mat)); c.mat [1] [1] = 1; c.mat [1] [2] = 0; c.mat [2] [1] = 0; c.mat [2] [2] = 1; 동안 (N! = 0) { 경우 (n은 1 == 1) C = matmult (C, A, 개조); A = matmult (A, A, 개조); N = N >> 1; } C를 반환; } 공극 get_prime () { INT (I = 2; I <maxn; 내가 ++)에 대한 { 경우 (아니오 [I] == false)를 { P는 [++ TOT] = 1; 대 (INT의 J = I, J <maxn, J = J가 + I) YN [J]를 참 =; } } //의 printf ( "% D \ 없음", TOT); P [1] = 3; P [2] = 4; } 초기화 () 무효화 { freopen을 ( "a.in", "R", 표준 입력); freopen을 ( "a.out의", "w", 표준 출력); } INT 주 () { // 초기화 (); get_prime (); INT T; CIN >> T; (T--) 동안 { INT의 ANSI; INT 온도; 노드 (A), (C); memset 함수 (a.mat, 0는 sizeof (a.mat)); memset 함수 (c.mat, 0는 sizeof (c.mat)); a.mat [1] [1] = 1, a.mat [1] [2] = 1, a.mat [2] [1] = 1, a.mat [2] [2] = 0; 는 scanf ( " 대해 INT (I = P 내가 ++; [K]) { C = quickmatpow (a, I-2, X); 온도 = ((c.mat [1] [1] + c.mat [1] [2]))의 X %; 경우 (임시 == 0) { ANSI = 1; 단절; } } C = quickmatpow (a, ANSI-2, M에서의 X *); 온도 = ((c.mat [1] [1] + c.mat [1] [2])) % (M에서의 X *); 의 printf ( "% D \ 없음"온도 / X); } 0을 반환; }