【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("\n");
78     }
79     return 0;
80 }

时间: 2024-12-11 00:43:46

【BZOJ 2656】2656: [Zjoi2012]数列(sequence) (高精度)的相关文章

【BZOJ2656】[Zjoi2012]数列(sequence) 高精度

[BZOJ2656][Zjoi2012]数列(sequence) Description 小白和小蓝在一起上数学课,下课后老师留了一道作业,求下面这个数列的通项公式: 小白作为一个数学爱好者,很快就计算出了这个数列的通项公式.于是,小白告诉小蓝自己已经做出来了,但为了防止小蓝抄作业,小白并不想把公式公布出来.于是小白为了向小蓝证明自己的确做出来了此题以达到其炫耀的目的,想出了一个绝妙的方法:即让小蓝说一个正整数N,小白则说出 的值,如果当N很大时小白仍能很快的说出正确答案,这就说明小白的确得到了

BZOJ 2656 ZJOI2012 数列(sequence) 高精度+记忆化搜索

题目大意:给定一个数列的通项公式,求数列的某一项 高精度+记忆化搜索没说的 其实不用记忆化搜索的但是既然写完了就写完了吧 顺便学习了一下友元函数之类的东西- - #include <map> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; class Big_Int{ private: int nu

BZOJ 2656 ZJOI 2012 数列(sequence) 高精度+记忆化搜索

题目大意:定义个一序列,f[i] = f[i / 2] (i % 2 == 0);f[i] = f[i / 2] + f[i / 2 + 1] (i % 2 == 1);求这个数列的第m项(m <= 10 ^ 100) 思路:数据范围高精度没跑了.记得之前做过这个题的弱化版,似乎是没有高精度的记忆化搜索,这个题就是加个高精度. CODE: #include <map> #include <cstdio> #include <cstring> #include &l

bzoj 2656 [Zjoi2012]数列(sequence) 递推+高精度

2656: [Zjoi2012]数列(sequence) Time Limit: 2 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 小白和小蓝在一起上数学课,下课后老师留了一道作业,求下面这个数列的通项公式: 小白作为一个数学爱好者,很快就计算出了这个数列的通项公式.于是,小白告诉小蓝自己已经做出来了,但为了防止小蓝抄作业,小白并不想把公式公布出来.于是小白为了向小蓝证明自己的确做出来了此题以达到其炫耀的目的,想出了

【BZOJ2656】 [Zjoi2012]数列(sequence)

2656: [Zjoi2012]数列(sequence) Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 1485  Solved: 779[Submit][Status][Discuss] Description 小白和小蓝在一起上数学课,下课后老师留了一道作业,求下面这个数列的通项公式: 小白作为一个数学爱好者,很快就计算出了这个数列的通项公式.于是,小白告诉小蓝自己已经做出来了,但为了防止小蓝抄作业,小白并不想把公式公布出来.于是小白为了向小蓝

[BZOJ 2656][ZJOI2012]数列(递归+高精度)

题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2656 分析: 很容易想到递归分治,但遇到奇数时候f[i]=f[i/2]+f[i/2+1]这样两个部分都分治去做,那么整个时间就退化到了线性. 不过容易发现: f[23]=f[11]+f[12] f[11]=f[5]+f[6] f[12]=f[6] 所以要求f[11],f[12]只要求f[5],f[6] f[5]=f[2]+f[3] f[6]=f[3] 所以要求f[5],f[6]只要求

BZOJ 1500: [NOI2005]维修数列

1500: [NOI2005]维修数列 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 12880  Solved: 4112[Submit][Status][Discuss] Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行包含N个数字,描述初始时的数列.以下M行,每行一条命令,格式参见问题描述中的表格.任何时刻数列中最多含有500 000个数,

【BZOJ 3043】 3043: IncDec Sequence (差分)

3043: IncDec Sequence Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 589  Solved: 332 Description 给定一个长度为n的数列{a1,a2...an},每次可以选择一个区间[l,r],使这个区间内的数都加一或者都减一.问至少需要多少次操作才能使数列中的所有数都一样,并求出在保证最少次数的前提下,最终得到的数列有多少种. Input 第一行一个正整数n 接下来n行,每行一个整数,第i+1行的整数表示ai.

【BZOJ 4305】 4305: 数列的GCD (数论)

4305: 数列的GCD Description 给出一个长度为N的数列{a[n]},1<=a[i]<=M(1<=i<=N). 现在问题是,对于1到M的每个整数d,有多少个不同的数列b[1], b[2], ..., b[N],满足: (1)1<=b[i]<=M(1<=i<=N): (2)gcd(b[1], b[2], ..., b[N])=d: (3)恰好有K个位置i使得a[i]<>b[i](1<=i<=N) 注:gcd(x1,x2,