C - 프라임 S (피보나치 수의 속성을 계산

정의 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을 반환; 

}

  

 

 

 





추천

출처www.cnblogs.com/zhangbuang/p/11240476.html