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 }