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

    2656: [Zjoi2012]数列(sequence)

    Time Limit: 2 Sec  Memory Limit: 128 MB
    Submit: 1499  Solved: 786

    Description

       小白和小蓝在一起上数学课,下课后老师留了一道作业,求下面这个数列的通项公式:

     

       小白作为一个数学爱好者,很快就计算出了这个数列的通项公式。于是,小白告诉小蓝自己已经做出来了,但为了防止小蓝抄作业,小白并不想把公式公布出来。于是小白为了向小蓝证明自己的确做出来了此题以达到其炫耀的目的,想出了一个绝妙的方法:即让小蓝说一个正整数N,小白则说出 的值,如果当N很大时小白仍能很快的说出正确答案,这就说明小白的确得到了公式。但这个方法有一个很大的漏洞:小蓝自己不会做,没法验证小白的答案是否正确。作为小蓝的好友,你能帮帮小蓝吗?

    Input

          输入文件第一行有且只有一个正整数T,表示测试数据的组数。

         第2~T+1行,每行一个非负整数N。

    Output

          输出文件共包含T行。

    第i行应包含一个不含多余前缀0的数,它的值应等于An(n为输入数据中第i+1行被读入的整数)

    【样例输入】

    Sample Input

    3

    1

    3

    10

    Sample Output

    1
    2
    3


    HINT

    T<=20,N<=10^100

    Source

    【分析】

      就是可以直接高精度暴力的。因为每次最多分出两个数而已。

      比如:

      $25→12,13→6,7→3,4→1,2→0,1$

     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<cstring>
     4 #include<iostream>
     5 #include<algorithm>
     6 using namespace std;
     7 
     8 int mymax(int x,int y) {return x>y?x:y;}
     9 
    10 struct hugeint
    11 {
    12     int a[110],l;
    13     void clear()
    14     {
    15         memset(a,0,sizeof(a));
    16         l=1;
    17     }
    18     friend hugeint operator + (hugeint x,hugeint y)
    19     {
    20         int ll=mymax(x.l,y.l);
    21         for(int i=1;i<=ll;i++) x.a[i]=x.a[i]+y.a[i];
    22         for(int i=1;i<=ll;i++) x.a[i+1]+=x.a[i]/10,x.a[i]%=10;
    23         while(x.a[ll+1]!=0) x.a[ll+2]+=x.a[ll+1]/10,x.a[ll+1]%=10,ll++;
    24         x.l=ll;
    25         return x;
    26     }
    27     friend hugeint operator + (hugeint x,int y)
    28     {
    29         int ll=x.l;  x.a[1]+=y;
    30         for(int i=1;i<=ll;i++) x.a[i+1]+=x.a[i]/10,x.a[i]%=10;
    31         while(x.a[ll+1]!=0) x.a[ll+2]+=x.a[ll+1]/10,x.a[ll+1]%=10,ll++;
    32         x.l=ll;
    33         return x;
    34     }
    35     friend hugeint operator / (hugeint x,int y)
    36     {
    37         int nw=0;
    38         for(int i=x.l;i>=1;i--)
    39         {
    40             nw=nw*10+x.a[i];
    41             x.a[i]=nw/y;
    42             nw%=y;
    43         }
    44         while(x.a[x.l]==0&&x.l>1) x.l--;
    45         return x;
    46     }
    47 };
    48 
    49 hugeint k1,k2;
    50 void dfs(hugeint xx)
    51 {
    52     if(xx.l==1&&xx.a[1]==1)
    53     {
    54         k1=xx;k2.clear();
    55         return;
    56     }
    57     dfs((xx+1)/2);
    58     if(xx.a[1]&1) k1=k1+k2;
    59     else k2=k1+k2;
    60 }
    61 
    62 char s[110];
    63 
    64 int main()
    65 {
    66     int T;
    67     scanf("%d",&T);
    68     while(T--)
    69     {
    70         scanf("%s",s+1);
    71         int l=strlen(s+1);
    72         hugeint xx;xx.clear();
    73         for(int i=1;i<=l;i++) xx.a[l-i+1]=s[i]-'0';
    74         xx.l=l;
    75         dfs(xx);
    76         for(int i=k1.l;i>=1;i--) printf("%d",k1.a[i]);
    77         printf("
    ");
    78     }
    79     return 0;
    80 }
    View Code
  • 相关阅读:
    python 线程队列、线程池、全局解释器锁GIL
    java Cookie 获取历史记录列表(三)
    Java中如何读写cookie (二)
    java读取和写入浏览器Cookies
    zookeeper的安装和部署
    Spring Boot 多模块项目创建与配置 (一)
    十款效果惊艳的Html案例(一)
    phython
    阿里高并发所用到的技术
    Java9新特性
  • 原文地址:https://www.cnblogs.com/Konjakmoyu/p/6671480.html
Copyright © 2011-2022 走看看