이런 건 또 어떻게 풀까 싶었는데 전처리..!
미리 해싱해놓고 Fn 받아서 n 출력하면 된다. 어메이징!!
이것도 안보고 다시 풀어봤다.
#include <iostream>
#include <algorithm>
#include <vector>
#include <string>
#include <functional>
#include <string>
#include <queue>
#include <stack>
#include <set>
#include <map>
#define mod ((i64)1e10)
using namespace std;
using i64 = long long;
using ii = pair<int, int>;
using ii64 = pair<i64, i64>;
int main()
{
map<i64, int> m;
i64 n1 = 0;
i64 n2 = 1;
m[1] = 1;
for (int i = 2; i <= 1000000; i++)
{
i64 num = (n1 + n2)%mod;
n1 = n2;
n2 = num;
m[num] = i;
}
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
string s;
cin >> s;
i64 search;
if (s.size() > 10)
search = stoll(s.substr(s.size()-10, 10));
else
search = stoll(s);
cout << m[search] << "\n";
}
return 0;
}
사실 안 보지는 않았고 #define mod ((i64)1e10) 만 기억 안 나서 눈 게슴츠레 뜨고 확인했음
코드 흐름은 아래처럼 짰다.
1. 미리 피보나치 수열 해싱해놓기
- m[1]값은 계산 안 돼있어서 따로 넣어 줘야함
2. 문자열로 입력받은 후 map에서 값 찾아서 출력
여기서 #define mod ((i64)1e10) 로 mod하는거랑
문자열 숫자로 바꿀 때 stoi 사용하는 거랑 substr 같은건 알아놓으면 좋을 듯
재밌고 신기한 문제였다
'UCPC' 카테고리의 다른 글
[20/05/24] D 차량 번호판 2 (16969) (0) | 2020.05.30 |
---|---|
[20/05/24] B 겉넓이 구하기 (16931) (0) | 2020.05.30 |
[20/05/24] I 팬케이크 쌓기(12744) (0) | 2020.05.30 |
[20/05/24] H 색칠공부(17092) (0) | 2020.05.30 |
[20/05/17] L. MaratonIME doesn't like odd numbers (0) | 2020.05.29 |