标签:
XXX
1 #include<cstdio> 2 #include<iostream> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<vector> 7 using namespace std; 8 typedef unsigned long long ll; 9 ll a,mod=1,L=1; 10 ll tr[4],b[4],tmp[4]; 11 std::vector <ll> ans,ans2; 12 ll read(){ 13 ll t=0,f=1;char ch=getchar(); 14 while (ch<‘0‘||ch>‘9‘){if (ch==‘-‘)f=-1;ch=getchar();} 15 while (‘0‘<=ch&&ch<=‘9‘){t=t*10+ch-‘0‘;ch=getchar();} 16 return t*f; 17 } 18 ll Mul(ll a,ll b){ 19 if (mod<=1000000000) 20 return a*b%mod; 21 else 22 return b?((Mul(a,b>>16)<<16)+a*(b&65535))%mod:0; 23 } 24 void Mul(ll *a,ll *b) { 25 static ll c[4]; 26 c[0]=(Mul(a[0],b[0])+Mul(a[1],b[2]))%mod; 27 c[1]=(Mul(a[0],b[1])+Mul(a[1],b[3]))%mod; 28 c[2]=(Mul(a[2],b[0])+Mul(a[3],b[2]))%mod; 29 c[3]=(Mul(a[2],b[1])+Mul(a[3],b[3]))%mod; 30 memcpy(a,c,sizeof c); 31 } 32 void init(ll *tr,ll L){ 33 static ll tc[4]; 34 tc[0]=0; tc[1]=1; tc[2]=1; tc[3]=1; 35 tr[0]=1; tr[1]=0; tr[2]=0; tr[3]=1; 36 for (;L;L>>=1,Mul(tc,tc)) 37 if (L&1) Mul(tr,tc); 38 } 39 int main(){ 40 cin>>a;ans.push_back(0);mod=1;L=1; 41 for (int p=1;p<=13;p++){ 42 mod*=10; 43 init(tr,L); 44 init(b,0); 45 ll L2=0; 46 do{ 47 for (int i=0;i<ans.size();i++){ 48 init(tmp,ans[i]+L2); 49 if (tmp[2]==a%mod) ans2.push_back(ans[i]+L2); 50 } 51 L2+=L; 52 Mul(b,tr); 53 }while(b[0]!=1||b[1]!=0||b[2]!=0||b[3]!=1); 54 std::swap(ans,ans2); 55 ans2.clear(); 56 L=L2; 57 } 58 if (ans.empty()) puts("-1"); 59 std::cout<<ans[0]<<std::endl; 60 }
标签:
原文地址:http://www.cnblogs.com/qzqzgfy/p/5648032.html