URAL - 1108 Heritage(大数)

恶心的大数运算,,,

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

题意:

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

代码如下:

#include <cstdio>
#include <cstring>
#define MOD 100000000
long 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;
}


你可能感兴趣的:(URAL - 1108 Heritage(大数))