Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
坑爹呀,不知道可以用INT64过,还小写了大数结构体!!#include <iostream> #include <cstdio> #include <cmath> using namespace std; #define N 55 struct BigInter { const static int L=200; int Bit[L]; int Blen; BigInter(int l =0) { Blen = 0; memset(Bit,0,sizeof(Bit)); while(l) { Bit[Blen++] = l%10; l/=10; } if(Blen == 0) Blen = 1; } void Init() { Blen = 1; memset(Bit,0,sizeof(Bit)); } void operator + (const BigInter other) { int Maxlen = max(Blen,other.Blen); Blen = Maxlen; for(int i=0;i<Maxlen;i++) Bit[i] += other.Bit[i]; for(int i=0;i<Maxlen;i++) if(Bit[i]> 9 ) { Bit[i+1] += Bit[i]/10; Bit[i] %= 10; } if(Bit[Maxlen]>0) Blen = Maxlen+1; return ; } bool IsDivTwo() { return !(Bit[0] %2); } void operator / (const int s) { for(int i=Blen-1;i>=0;i--) { if(i!=0) Bit[i-1] += Bit[i]%2*10; Bit[i] /= 2; } while(Bit[Blen-1]==0&&Blen>1) Blen--; } void operator * (const int s) { for(int i=0;i<Blen;i++) Bit[i] *= 2; for(int i=0;i<Blen;i++) if(Bit[i]>9) { Bit[i+1] += Bit[i]/10; Bit[i] %= 10; } if(Bit[Blen]>0) Blen = Blen+1; return ; } void Print() { if(Bit[0]==0 && Blen==1) printf("0"); else for(int i=Blen-1;i>=0;i--) printf("%d",Bit[i]); } }; BigInter Dp[N][N]; int n,m; char Map[N][N]; void Init() { for(int i=0;i<=n+2;i++) for(int j=0;j<=n+2;j++) Dp[i][j].Init(); Dp[0][0] = BigInter(1); } bool Input() { if(cin>>n>>m) { getchar(); for(int i=1;i<=n;i++) { char tmp[100]; gets(tmp); int l = strlen(tmp); int ll = 0; for(int j=0;j<l;j++) if(tmp[j] != ' ') Map[i][ll++] = tmp[j]; } return true; } return false; } void solve() { Init(); for(int i=0;i<n;i++) for(int j=0;j<=i;j++) { if(Map[i+1][j]=='*') { Dp[i+1][j].operator+(Dp[i][j]); Dp[i+1][j+1].operator+(Dp[i][j]); } else { BigInter B = Dp[i][j];B.operator*(2);B.operator*(2); Dp[i+2][j+1].operator+(B); } } int k=n; for(;k>=1;k--) if(Dp[n][m].IsDivTwo()) Dp[n][m].operator/(2); else break; Dp[n][m].Print();printf("/"); if(k>1){ BigInter var(2); for(int i=1;i<k;i++) var.operator*(2); var.Print(); } else printf("1"); printf("\n"); } int main() { while(Input()) solve(); return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator