#include <iostream> #include <vector> struct Periods10 { long long P[20]; Periods10() { P[0] = 1LL; P[1] = 60LL; P[2] = 300LL; P[3] = 1500LL; for(int i=4;i<=18;++i) P[i] = P[i-1]*10LL; } long long get(int i) {return P[i];} }; long long mult(long long a, long long b,long long m){ return a?(a%2*b+mult(a/2,2*b%m,m))%m:0LL; } long long rA,rB; long long a,b; void find_fib(long long k,long long m){ if(k==0) {rA=0; rB=1; return;} find_fib(k/2,m); a = mult((m-rA+2*rB)%m,rA,m); // = (m-a+2*b)%m*a%m; b = (mult(rB,rB,m)+mult(rA,rA,m))%m; // = (b*b%m+a*a%m)%m; if(k%2==0){rA = a; rB = b;} else{rA = b; rB = (a+b)%m;} } // finds Fib_k mod m long long fib(long long k,long long m){ find_fib(k,m); return rA; } char C[20]; int main(){ Periods10 per; int n; long long c; std::cin>>C; for(c = n = 0;C[n];++n) c = 10*c + C[n]-'0'; long long m = 1; std::vector<long long> prev(0); std::vector<long long> cur(0); prev.push_back(0); for(int i=1;i<=n;++i){ m*=10; for(long long e : prev) for(long long j = 0 ; j <per.get(i)/per.get(i-1); ++j){ long long k = per.get(i-1)*j+e; if(fib(k,m) == c%m) cur.push_back(k); } prev = cur; cur.clear(); } if(!prev.empty()) std::cout<< prev[0] << std::endl; else std::cout << "NIE" << std::endl; return 0; }
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 | #include <iostream> #include <vector> struct Periods10 { long long P[20]; Periods10() { P[0] = 1LL; P[1] = 60LL; P[2] = 300LL; P[3] = 1500LL; for(int i=4;i<=18;++i) P[i] = P[i-1]*10LL; } long long get(int i) {return P[i];} }; long long mult(long long a, long long b,long long m){ return a?(a%2*b+mult(a/2,2*b%m,m))%m:0LL; } long long rA,rB; long long a,b; void find_fib(long long k,long long m){ if(k==0) {rA=0; rB=1; return;} find_fib(k/2,m); a = mult((m-rA+2*rB)%m,rA,m); // = (m-a+2*b)%m*a%m; b = (mult(rB,rB,m)+mult(rA,rA,m))%m; // = (b*b%m+a*a%m)%m; if(k%2==0){rA = a; rB = b;} else{rA = b; rB = (a+b)%m;} } // finds Fib_k mod m long long fib(long long k,long long m){ find_fib(k,m); return rA; } char C[20]; int main(){ Periods10 per; int n; long long c; std::cin>>C; for(c = n = 0;C[n];++n) c = 10*c + C[n]-'0'; long long m = 1; std::vector<long long> prev(0); std::vector<long long> cur(0); prev.push_back(0); for(int i=1;i<=n;++i){ m*=10; for(long long e : prev) for(long long j = 0 ; j <per.get(i)/per.get(i-1); ++j){ long long k = per.get(i-1)*j+e; if(fib(k,m) == c%m) cur.push_back(k); } prev = cur; cur.clear(); } if(!prev.empty()) std::cout<< prev[0] << std::endl; else std::cout << "NIE" << std::endl; return 0; } |