#include<cstdio> #include<cstring> #define N 20 typedef long long ll; typedef unsigned long long ull; int n,i,flag;char a[N];ll mo[N],b[N];ull ans; inline ull mul(ull a,ull b,ull P){ull t=0;for(;b;b>>=1,a=(a+a)%P)if(b&1)t=(t+a)%P;return t;} void cal(ll n,ll&x,ll&y,ll P){ if(!n){x=0,y=1;return;} if(n==1){x=y=1;return;} if(n&1){ cal(n-1,y,x,P); y=(1ULL*y+x)%P; return; } ll a,b; cal(n>>1,a,b,P); x=(mul(a,b,P)+mul(a,b<a?b-a+P:b-a,P))%P; y=(mul(a,a,P)+mul(b,b,P))%P; } inline ll fib(ll n,ll P){ll x,y;cal(n,x,y,P);return x;} void dfs(int n,ll t,ll T){ if(flag)return; if(fib(t,mo[n])!=b[n])return; if(n==1){flag=1,ans=6000000000000000000ULL+t;return;} for(int i=0;i<10;i++)dfs(n-1,(1ULL*t+T*i)%(T*10),T*10); } int main(){ scanf("%s",a+1),n=strlen(a+1); for(mo[i=n]=1;i;i--,mo[i]=mo[i+1]*10)b[i]=mo[i]*(a[i]-'0')+b[i+1]; for(i=1;i<=n;i++)mo[i]*=10; for(i=0;i<60;i++)dfs(n,i,60); if(flag)printf("%llu",ans);else puts("NIE"); 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 | #include<cstdio> #include<cstring> #define N 20 typedef long long ll; typedef unsigned long long ull; int n,i,flag;char a[N];ll mo[N],b[N];ull ans; inline ull mul(ull a,ull b,ull P){ull t=0;for(;b;b>>=1,a=(a+a)%P)if(b&1)t=(t+a)%P;return t;} void cal(ll n,ll&x,ll&y,ll P){ if(!n){x=0,y=1;return;} if(n==1){x=y=1;return;} if(n&1){ cal(n-1,y,x,P); y=(1ULL*y+x)%P; return; } ll a,b; cal(n>>1,a,b,P); x=(mul(a,b,P)+mul(a,b<a?b-a+P:b-a,P))%P; y=(mul(a,a,P)+mul(b,b,P))%P; } inline ll fib(ll n,ll P){ll x,y;cal(n,x,y,P);return x;} void dfs(int n,ll t,ll T){ if(flag)return; if(fib(t,mo[n])!=b[n])return; if(n==1){flag=1,ans=6000000000000000000ULL+t;return;} for(int i=0;i<10;i++)dfs(n-1,(1ULL*t+T*i)%(T*10),T*10); } int main(){ scanf("%s",a+1),n=strlen(a+1); for(mo[i=n]=1;i;i--,mo[i]=mo[i+1]*10)b[i]=mo[i]*(a[i]-'0')+b[i+1]; for(i=1;i<=n;i++)mo[i]*=10; for(i=0;i<60;i++)dfs(n,i,60); if(flag)printf("%llu",ans);else puts("NIE"); return 0; } |