bzoj 1002 轮状病毒

这题我只是为了练高精度

然后我就写了个压位高精

结果还没有1a

深感自己的菜

第一次因为输出了中间结果

第二次是因为没有管自己打的进/借位标记

太菜了

代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cmath>
 4 #include<cstdlib>
 5 #include<algorithm>
 6 #include<cstring>
 7 #include<vector>
 8 #include<map>
 9 #include<queue>
10 #define inf 2147483611
11 #define ll long long 
12 #define MAXN 110
13 #define MOD 1000000000
14 using namespace std;
15 inline int read()
16 {
17     int x=0,f=1;
18     char ch;ch=getchar();
19     while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
20     while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();}
21     return x*f; 
22 }
23 struct bign
24 {
25     int len,val[12];
26     bign() {memset(val,0,sizeof(val));len=0;}
27     void Print()
28     {
29         printf("%d",val[len]);
30         for(int i=len-1;i>=0;i--)
31         {
32             printf("%09d",val[i]);
33         }
34     }
35     bign operator + (const bign &a) const
36     {
37         bign ans;
38         ans.len=max(len,a.len);
39         for(int i=0;i<=ans.len;i++)
40         {
41             ans.val[i]+=val[i]+a.val[i];
42             if(ans.val[i]>=MOD) {ans.val[i+1]++;ans.val[i]-=MOD;}
43         }
44         if(ans.val[ans.len+1]) ans.len++;
45         return ans;
46     }
47     bign operator - (const bign &a) const
48     {
49         bign ans;
50         ans.len=max(len,a.len);
51         for(int i=0;i<=ans.len;i++)
52         {
53             ans.val[i]+=val[i]-a.val[i];
54             if(ans.val[i]<0) {ans.val[i+1]--;ans.val[i]+=MOD;}
55         }
56         if(ans.val[ans.len]<=0) ans.len--;
57         return ans;
58     }
59 }f[MAXN];
60 int main()
61 {
62     int n=read();
63     if(n==1) printf("1");
64     f[1].val[0]=1;
65     bign k;k.val[0]=2;
66     for(int i=2;i<=n;i++)
67     {
68         f[i]=f[i-1]+f[i-1]+f[i-1]-f[i-2]+k;
69     }
70     f[n].Print();
71 }
View Code

 

posted @ 2017-09-30 17:43  jack_yyc  阅读(132)  评论(0编辑  收藏  举报