• 【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中的sort()方法使用基础
    centos修改时区shanghai
    const 关键字修饰指针
    多主题
    多语言(国际化)
    动画
    字符编码
    .vscode/extensions.json 是项目用到的 插件 推荐列表,项目应该将此配置 写入用到的插件
    end_of_line = lf 选择行尾序列 .editorconfig 老项目不动代码存盘 文件变动 CRLF 的问题 vscode
    vetur 和 volar 不要一起装 vscode插件 已解决
  • 原文地址:https://www.cnblogs.com/Konjakmoyu/p/6671480.html
Copyright © 2020-2023  润新知