[高精度][规律][二分] Jzoj P4213 对你的爱深不见底
Posted comfortable
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[高精度][规律][二分] Jzoj P4213 对你的爱深不见底相关的知识,希望对你有一定的参考价值。
题解
- 这就是道打表找规律的题目,至于怎么证明有没有大佬教一教
- 找到第一个斐波那契数列长度n大于m+1,答案就是 m-|n-2|
- 然后就要上高精度了,因为我们还要找到n,打个二分
代码
1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #define mo 258280327 5 #define N 1010 6 using namespace std; 7 struct edge{ int a[1005],l; }f[N],p; 8 int T,n,P[N]; 9 void add(edge &x,edge &y,edge &k) 10 { 11 for (int i=1;i<k.l+1;i++) k.a[i]=0; k.l=0; 12 for (int i=1;i<=max(x.l,y.l);i++) k.a[i]+=x.a[i]+y.a[i],k.a[i+1]+=k.a[i]/10,k.a[i]%=10; 13 k.l=max(x.l,y.l); while (k.a[k.l+1]) k.l++,k.a[k.l+1]=k.a[k.l]/10,k.a[k.l]%=10; 14 } 15 bool check(edge a,edge b) 16 { 17 if (a.l!=b.l) return a.l<b.l; 18 for (int i=a.l;i;i--) if (a.a[i]!=b.a[i]) return a.a[i]<b.a[i]; 19 return 0; 20 } 21 int main() 22 { 23 scanf("%d",&T),f[1].a[1]=f[1].l=f[2].a[1]=f[2].l=1; 24 for (int i=3;i<=1001;i++) add(f[i-2],f[i-1],f[i]); 25 while (T--) 26 { 27 scanf("%d",&n),memset(p.a,0,sizeof(p.a)),p.l=0; 28 char ch; while (ch=getchar(),ch<‘0‘||ch>‘9‘); 29 P[p.l=1]=ch-48; while (ch=getchar(),ch>=‘0‘&&ch<=‘9‘) P[++p.l]=ch-48; 30 for (int i=p.l;i;i--) p.a[p.l-i+1]=P[i]; p.a[1]++; 31 for (int i=1;i<=p.l;i++) p.a[i+1]+=p.a[i]/10,p.a[i]%=10; 32 if (p.a[p.l+1]) p.l++; 33 int l=1,r=1001,q=0; 34 while (l<=r) 35 { 36 int mid=l+r>>1; 37 if (check(p,f[mid])) q=mid,r=mid-1; else l=mid+1; 38 } 39 q-=2,p.a[1]--; 40 for (int i=1;i<=f[q].l;i++) 41 { 42 p.a[i]-=f[q].a[i]; 43 if (p.a[i]<0) p.a[i]+=10,p.a[i+1]--; 44 } 45 while (p.l>1&&!p.a[p.l]) p.l--; 46 q=0; for (int i=p.l;i;i--) q=(q*10ll+p.a[i])%mo; 47 printf("%d ",q); 48 } 49 }
以上是关于[高精度][规律][二分] Jzoj P4213 对你的爱深不见底的主要内容,如果未能解决你的问题,请参考以下文章