HDU 4927 大數

來源:互聯網
上載者:User

標籤:java   io   for   ar   div   amp   size   ad   

題意很簡單:

對於長度為n的數,做n-1遍,產生的新數列: 

b1=a2-a1   b2=a3-a2  b3=a4-a3

c1=b2-b1   c2=b3-b2

ans=c2-c1

最後推出公式:  為n所在行的楊輝三角

對於範例:

3

1 2 3

ans=1*1-2*2+1*3=0

4

1 5 7 2

ans=-1*1+3*5-3*7+1*2=-5

求楊輝三角每個數的時候可以最佳化一下,後一個數由前一個各乘除一次就好了

JAVA用大數秒A。。。BUT 不會JAVA  - -#

蛋疼用C++類比大數。。


#include "stdio.h"#include "string.h"int a[3010];__int64 mark[3010],ans[3010],c[3010];int Max(int a,int b){    if (a<b) return b;else return a;}void make_mul(int x){    int i;    for (i=1;i<=mark[0];i++)        mark[i]*=x;    for (i=1;i<=mark[0];i++)    {        mark[i+1]+=mark[i]/1000000;        mark[i]%=1000000;    }    while (mark[mark[0]+1]!=0)    {        mark[0]++;        mark[mark[0]+1]=mark[mark[0]]/1000000;        mark[mark[0]]%=1000000;    }}void make_div(int x){    int i;    for (i=mark[0];i>=2;i--)    {        mark[i-1]+=(mark[i]%x)*1000000;        mark[i]/=x;    }    mark[1]/=x;    while (mark[mark[0]]==0) mark[0]--;}void make_add(){    int i,op;    if (ans[0]>0)    {        for (i=1;i<=mark[0];i++)        {            ans[i]+=mark[i];            ans[i+1]+=ans[i]/1000000;            ans[i]%=1000000;        }        while (ans[ans[0]+1]!=0)        {            ans[0]++;            ans[ans[0]+1]=ans[ans[0]]/1000000;            ans[ans[0]]%=1000000;        }        return ;    }    else    {        if (-ans[0]>mark[0]) op=-1;        else if (-ans[0]<mark[0]) op=1;        else        {            for (i=mark[0];i>=1;i--)            if (mark[i]>ans[i]) { op=1;break;}            else if (mark[i]<ans[i]) { op=-1; break;}            if (i==0)            {                memset(ans,0,sizeof(ans));                ans[0]=1;                return ;            }        }            if (op==1)            {                for (i=1;i<=mark[0];i++)                {                    ans[i]=mark[i]-ans[i];                    if (ans[i]<0)                    {                        mark[i+1]--;                        ans[i]+=1000000;                    }                }                ans[0]=-ans[0];                while (ans[ans[0]]==0) ans[0]--;            }            else            {                for (i=1;i<=-ans[0];i++)                {                    ans[i]=ans[i]-mark[i];                    if (ans[i]<0)                    {                        ans[i+1]--;                        ans[i]+=1000000;                    }                }                while (ans[-ans[0]]==0) ans[0]++;            }    }}void make_red(){    int i,op;    if (ans[0]<0)    {        for (i=1;i<=mark[0];i++)        {            ans[i]+=mark[i];            ans[i+1]+=ans[i]/1000000;            ans[i]%=1000000;        }        while (ans[-ans[0]+1]!=0)        {            ans[0]--;            ans[-ans[0]+1]=ans[-ans[0]]/1000000;            ans[-ans[0]]%=1000000;        }        return ;    }    else    {        if (ans[0]>mark[0]) op=1;        else if (ans[0]<mark[0]) op=-1;        else        {            for (i=mark[0];i>=1;i--)            if (mark[i]>ans[i]) { op=-1;break;}            else if (mark[i]<ans[i]) { op=1; break;}            if (i==0)            {                memset(ans,0,sizeof(ans));                ans[0]=1;                return ;            }        }            if (op==1)            {                for (i=1;i<=mark[0];i++)                {                    ans[i]=ans[i]-mark[i];                    if (ans[i]<0)                    {                        ans[i+1]--;                        ans[i]+=1000000;                    }                }                while (ans[ans[0]]==0) ans[0]--;            }            else            {                for (i=1;i<=mark[0];i++)                {                    ans[i]=mark[i]-ans[i];                    if (ans[i]<0)                    {                        mark[i+1]--;                        ans[i]+=1000000;                    }                }                ans[0]=mark[0];                while (ans[ans[0]]==0) ans[0]--;                ans[0]=-ans[0];            }    }}int main(){    int t,n,i,x,y,j,m,op;    scanf("%d",&t);    while (t--)    {        scanf("%d",&n);        for (i=1;i<=n;i++)            scanf("%d",&a[i]);        memset(ans,0,sizeof(ans));        ans[0]=1;        if (i==1)        {            printf("%d\n",a[1]);            continue;        }        memset(mark,0,sizeof(mark));        mark[0]=1;        mark[1]=1;        if (n%2==1) ans[1]=a[1];        else ans[1]=-a[1];        x=1;        y=n-1;        for (i=2;i<=n;i++)        {            make_mul(y);            y--;            make_div(x);            x++;            memcpy(c,mark,sizeof(mark));            make_mul(a[i]);            if (n%2==1)            {                if (i%2==1) make_add();                else make_red();            }            else            {                if (i%2==0) make_add();                else make_red();            }            memcpy(mark,c,sizeof(c));        }        if (ans[0]>0)        {            printf("%I64d",ans[ans[0]]);            for (i=ans[0]-1;i>=1;i--)                printf("%06I64d",ans[i]);            printf("\n");        }        else        {            printf("-");            printf("%I64d",ans[-ans[0]]);            for (i=-ans[0]-1;i>=1;i--)                printf("%06I64d",ans[i]);            printf("\n");        }    }    return 0;}



相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.