본문 바로가기

알고리즘/BOJ

9471번

9471번 - 피사노 주기


2749번 피보나치 수 3 문제와 아주 똑같이 풀면 된다.


2749번 에서는 나머지를 구했지만, 여기서는 반복되는 구간의 길이만 구하면 된다.


설명은 2749번과 동일


<정답 코드>


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
#include<iostream>
#include<vector>
using namespace std;
 
//const long long  mod = 1000000;
 
int main()
{
    int P;
    scanf("%d"&P);
    while (P--)
    {
        vector<long long> num;
        long long  N;
        long long mod;
 
        scanf("%lld %lld"&N,&mod);
 
        num.push_back(0);
        num.push_back(1);
 
        long long i = 1;
        long long j = 0;
        long long flag = -1;
        bool cycle = false;
 
        while (!cycle)
        {
            i++;
            long long  temp = (num[i - 1] % mod + num[i - 2] % mod) % mod;
            num.push_back(temp);
 
            if (temp == num[j++])
            {
                if (flag == -1)
                {
                    flag = i - 1;
                }
            }
            else
            {
                flag = -1;
                j = 0;
            }
 
            if (j == flag)
            {
                cycle = true;
            }
        }
 
        long long  size = j + 1;
        //long long rest = N % size;
 
        //printf("%lld\n", num[rest]);
        printf("%lld %lld\n",N, size);
    }
 
    
 
    return 0;
}
cs


반응형

'알고리즘 > BOJ' 카테고리의 다른 글

2086번  (0) 2017.12.31
11444번  (0) 2017.12.30
2749번  (0) 2017.12.30
10830번  (0) 2017.12.30
1629번  (0) 2017.12.30