URAL - 1108 Heritage(大数)

来源:互联网 发布:mac开机问号文件夹 编辑:程序博客网 时间:2024/04/28 09:28

恶心的大数运算,,,

比赛的时候,如果没有模版,一般置后的题目了,,,,

题意:

要求a,b,c,.....使得1-1/a-1/b-1/c-1/d.......的结果最小。。。

代码如下:

#include <cstdio>#include <cstring>#define MOD 100000000long long ans[100000], last[100000], temp[100000];int ans_l, last_l;void add(){    for(int i = 0; i < last_l; ++i)        ans[i] = last[i];    ans_l = last_l;    ans[0]+=1;    for(int i = 0; i < ans_l; ++i)    {        ans[i+1] += ans[i]/MOD;        ans[i] %= MOD;    }    while(ans[ans_l]!=0)    {        ans[ans_l+1] += ans[ans_l]/MOD;        ans[ans_l] %= MOD;        ans_l += 1;    }}void product(){     int temp_l = last_l+ans_l-1;     memset(temp,0,sizeof(temp));     for(int i = 0; i < last_l; ++i)        for(int j = 0; j < ans_l; ++j)            temp[j+i]+=last[i]*ans[j];    for(int i = 0; i < temp_l; ++i)    {        temp[i+1] += temp[i]/MOD;        temp[i]%=MOD;    }    while(temp[temp_l]!=0)    {        temp[temp_l+1] += temp[temp_l]/MOD;        temp[temp_l] %= MOD;        temp_l += 1;    }    for(int i = 0; i < temp_l; ++i)        last[i] = temp[i];    last_l = temp_l;}void print(){    for(int i = ans_l-1; i >= 0; i--)        i==ans_l-1?printf("%I64d", ans[i]):printf("%08I64d", ans[i]);    printf("\n");}int main (){    int n;    scanf("%d",&n);    memset(ans,0,sizeof(ans));    memset(last,0,sizeof(last));    last[0] = 1;    last_l = ans_l = 1;    for(int i = 1; i <= n; ++i)    {        add();        print();        product();    }    return 0;}