杭电1592
题意:Gardon买了巧克力一堆,路上遇n人,每人都给一半另加半个,最后自己就没有了。现在Gardon没有遇到最后拿光自己巧克力的那个人(共遇n人),求开始时有多少巧克力。
Analyse:假如Gardon跟朋友全遇上了,他一块也不剩,所以到最后一个人的时候他刚好有一块巧克力。设a[n]为遇到第n个人时他有的巧克力数,有关系式:a[1]/2+0.5+a[2]/2+0.5+……+a[n]/2+0.5=a[1]-1,a[n-1]/2-0.5=a[n]得出a[1]=pow(2,n+1)-1。注意到n<=1000,所以这是个大数问题。
View Code
1 #include<stdio.h> 2 #define INTLEN 80 3 struct BigInt 4 { 5 int digit[INTLEN]; 6 int len; 7 }; 8 struct BigInt temp; 9 void add(struct BigInt *a,struct BigInt *b,struct BigInt *c) 10 { 11 int carry; 12 int i; 13 struct BigInt *swaptemp; 14 if(a->len < b->len) 15 { 16 swaptemp=a; 17 a=b; 18 b=swaptemp; 19 } 20 temp.len=a->len; 21 carry=0; 22 for(i=0;i<b->len;i++) 23 { 24 temp.digit[i]=(a->digit[i]+b->digit[i]+carry)%10000; 25 carry=(a->digit[i]+b->digit[i]+carry)/10000; 26 } 27 for(;i<a->len;i++) 28 { 29 temp.digit[i]=(a->digit[i]+carry)%10000; 30 carry=(a->digit[i]+carry)/10000; 31 } 32 if(carry) 33 { 34 temp.digit[i]=carry; 35 temp.len++; 36 } 37 //转移 38 for(i=0;i<temp.len;i++) 39 c->digit[i]=temp.digit[i]; 40 c->len=temp.len; 41 } 42 //this function is based on the add function 43 struct BigInt inter,multiresult; 44 void multiply(struct BigInt *a,struct BigInt *b,struct BigInt *c) 45 { 46 int i,j,carry; 47 c->digit[0]=0; 48 c->len=1; 49 for(i=0;i<b->len;i++) 50 { 51 carry=0; 52 for(j=0;j<INTLEN;j++) 53 inter.digit[j]=0; 54 for(j=0;j<a->len;j++) 55 { 56 inter.digit[i+j]=(a->digit[j]*b->digit[i]+carry)%10000; 57 carry=(a->digit[j]*b->digit[i]+carry)/10000; 58 if(i+j+1>inter.len && inter.digit[i+j]!=0) 59 inter.len=i+j+1; 60 } 61 if(carry) 62 { 63 inter.digit[i+j]=carry; 64 inter.len=i+j+1; 65 } 66 add(&inter,c,c); 67 } 68 } 69 struct BigInt p[1002]; 70 int main() 71 { 72 int n,i; 73 p[1].digit[0]=2; 74 p[1].len=1; 75 //打表 76 for(n=2;n<1002;n++) 77 multiply(&p[n-1],&p[1],&p[n]); 78 for(n=1;n<1002;n++) 79 p[n].digit[0]--; 80 while(scanf("%d",&n)!=EOF) 81 { 82 i=p[n+1].len-1; 83 printf("%d",p[n+1].digit[i]); 84 for(i--;i>=0;i--) 85 printf("%04d",p[n+1].digit[i]); 86 printf("\n"); 87 } 88 return 0; 89 }


浙公网安备 33010602011771号