杭电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 }
posted @ 2012-07-23 22:47  Hogg  阅读(152)  评论(0)    收藏  举报