#include <cstdio>
#include <utility>
#include <cstring>
#include <queue>
using namespace std;
typedef long long ll;
ll mod;
struct matrix
{
ll a, b, c, d;
matrix(ll A = 0, ll B = 0, ll C = 0, ll D = 0): a(A % mod), b(B % mod), c(C % mod), d(D % mod) { }
};
ll mult(ll a, ll b)
{
if(b == 0) return 0;
if(b & 1) return (a + mult((a + a) % mod, b / 2)) % mod;
return mult((a + a) % mod, b / 2);
}
matrix operator*(matrix a, matrix b)
{
return matrix(mult(a.a, b.a) + mult(a.b, b.c), mult(a.a, b.b) + mult(a.b, b.d),
mult(a.c, b.a) + mult(a.d, b.c), mult(a.c, b.b) + mult(a.d, b.d));
}
matrix operator^(matrix a, ll b)
{
if(b == 1) return a;
if(b & 1) return a * (a ^ (b - 1));
return (a * a) ^ (b / 2);
}
ll pow10(int k)
{
ll ans = 1;
while(k--)
ans *= 10;
return ans;
}
inline ll fib(ll k)
{
return k == 0 ? 0 : (matrix(1, 1, 1, 0) ^ k).c;
}
int main()
{
ll c;
char s[20];
scanf("%s", s);
int n = strlen(s);
sscanf(s, "%lld", &c);
queue<pair<ll, int> > q;
pair<ll, ll> p(1, 0);
mod = pow10(min(3, n));
for(int i = 0; i < 1500; i++)
{
if(p.second == c % mod) q.push(make_pair((ll)i, 3));
p = make_pair((p.first + p.second) % mod, p.first);
}
while(!q.empty())
{
auto f = q.front();
q.pop();
if(f.second >= n)
{
printf("%lld\n", f.first + (ll)1.5e18);
return 0;
}
else
{
mod = pow10(f.second + 1);
for(int i = 0; i < 10; i++)
if(fib(f.first + mod / 20 * 3 * i) == c % mod)
q.push(make_pair(f.first + mod / 20 * 3 * i, f.second + 1));
}
}
puts("NIE");
}
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 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | #include <cstdio> #include <utility> #include <cstring> #include <queue> using namespace std; typedef long long ll; ll mod; struct matrix { ll a, b, c, d; matrix(ll A = 0, ll B = 0, ll C = 0, ll D = 0): a(A % mod), b(B % mod), c(C % mod), d(D % mod) { } }; ll mult(ll a, ll b) { if(b == 0) return 0; if(b & 1) return (a + mult((a + a) % mod, b / 2)) % mod; return mult((a + a) % mod, b / 2); } matrix operator*(matrix a, matrix b) { return matrix(mult(a.a, b.a) + mult(a.b, b.c), mult(a.a, b.b) + mult(a.b, b.d), mult(a.c, b.a) + mult(a.d, b.c), mult(a.c, b.b) + mult(a.d, b.d)); } matrix operator^(matrix a, ll b) { if(b == 1) return a; if(b & 1) return a * (a ^ (b - 1)); return (a * a) ^ (b / 2); } ll pow10(int k) { ll ans = 1; while(k--) ans *= 10; return ans; } inline ll fib(ll k) { return k == 0 ? 0 : (matrix(1, 1, 1, 0) ^ k).c; } int main() { ll c; char s[20]; scanf("%s", s); int n = strlen(s); sscanf(s, "%lld", &c); queue<pair<ll, int> > q; pair<ll, ll> p(1, 0); mod = pow10(min(3, n)); for(int i = 0; i < 1500; i++) { if(p.second == c % mod) q.push(make_pair((ll)i, 3)); p = make_pair((p.first + p.second) % mod, p.first); } while(!q.empty()) { auto f = q.front(); q.pop(); if(f.second >= n) { printf("%lld\n", f.first + (ll)1.5e18); return 0; } else { mod = pow10(f.second + 1); for(int i = 0; i < 10; i++) if(fib(f.first + mod / 20 * 3 * i) == c % mod) q.push(make_pair(f.first + mod / 20 * 3 * i, f.second + 1)); } } puts("NIE"); } |
English