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 |
반응형