zoukankan      html  css  js  c++  java
  • bzoj 2656 [Zjoi2012]数列(sequence)(高精度)

    【题目链接】

      http://www.lydsy.com/JudgeOnline/problem.php?id=2656

    【题意】

      计算大数递推式

    【思路】

      高精度

    【代码】

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<iostream>
     4 using namespace std;
     5 
     6 const int maxn = 105;
     7 const int base = 1e4;
     8 
     9 struct Bign {
    10     int len,N[maxn];
    11     int& operator[](const int& i){
    12         return N[i];
    13     }
    14     void init() {
    15         len=1;
    16         memset(N,0,sizeof(N));
    17     }
    18 };
    19 Bign tmp; char s[maxn];
    20 void read(Bign& A)
    21 {
    22     A.init(),tmp.init();
    23     scanf("%s",s+1);
    24     int i,j;
    25     tmp.len=strlen(s+1);
    26     for(int i=1;i<=tmp.len;i++)
    27         tmp[i]=s[tmp.len+1-i]-'0';
    28     A.len=(tmp.len-1)/4 +1;
    29     for(i=1;i<=A.len;i++) {
    30         for(j=1;j<=4;j++)
    31             A[i]=A[i]*10+tmp[(i-1)*4+(5-j)];
    32     }
    33 }
    34 void print(Bign A)
    35 {
    36     printf("%d",A[A.len]);
    37     for(int i=A.len-1;i;i--)
    38         printf("%04d",A[i]);
    39     puts("");
    40 }
    41 Bign operator + (Bign A,Bign B)
    42 {
    43     A.len=max(B.len,A.len);
    44     for(int i=1;i<=A.len;i++) {
    45         A[i]+=B[i];
    46         A[i+1]+=A[i]/base;
    47         A[i]%=base;
    48     }
    49     while(A[A.len+1]) A.len++;
    50     return A;
    51 }
    52 Bign operator + (Bign A,int x)
    53 {
    54     Bign B; B.init(); B[1]=x;
    55     return A+B;
    56 }
    57 Bign operator / (Bign A,int p)
    58 {
    59     for(int i=1;i<=A.len;i++) {
    60         if(A[i]&1) A[i-1]+=base/p;
    61         A[i]/=p;
    62     }
    63     while(!A[A.len]&&A.len) A.len--;
    64     return A;
    65 }
    66 
    67 Bign p,q,n;
    68 
    69 void F(Bign x)
    70 {
    71     if(x.len==1 && x[1]==1) {
    72         p=x; q.init(); return ;
    73     }
    74     F((x+1)/2);
    75     if(x[1]&1) p=p+q;
    76     else q=p+q;
    77 }
    78 
    79 int main()
    80 {
    81     int T; scanf("%d",&T);
    82     while(T--) {
    83         p.init(),q.init();
    84         read(n);
    85         F(n);
    86         print(p);
    87     }
    88     return 0;
    89 }

    Ps:每次做高精度都会涨姿势 >_<

  • 相关阅读:
    Web安全实践
    认证授权的设计与实现
    Elasticsearch 分页查询
    【算法】三色旗
    【转】互联网项目中mysql应该选什么事务隔离级别
    Elasticsearch 聚合
    Elasticsearch 结构化搜索、keyword、Term查询
    Elasticsearch 单字符串多字段查询
    Elasticsearch 复合查询——多字符串多字段查询
    JavaScript 原型与原型链
  • 原文地址:https://www.cnblogs.com/lidaxin/p/5263341.html
Copyright © 2011-2022 走看看