第一题:奇怪的贸易(提高组第二试2011年10月22日)(2011年NOIP冲刺模拟试题)

 奇怪的贸易

【问题描述】

刚结束了CS战斗的小D又进入了EVE的游戏世界,在游戏中小D是一名商人,每天要做的事情就是在这里买东西,再运到那里去卖。这次小D来到了陌生的X星,X星上有n种货物,小D决定每种都买走一些,他用ai来表示第i种货物购买的数量,X星人对物品的单价有特别的决定方式。他们首先会选择一个基本价x,第一种物品单价为x,第二种物品单价为x^2,第三种物品单价为x^3……第i种物品单价为x^i。结算总价时,你还需要给他们一笔手续费a0,小D不知道自己带的钱是否能够进行这笔交易,所以请你帮助他计算这笔交易他要支付的总金额是多少。

 

【输入】

第一行两个数分别表示基准价x (x<=10),物品种数n (n<=100000);

第二行一个数,手续费a0 (a0<=100);

接下来的n行每行一个数,第i行表示第i种物品购买的数量(ai<=100)。

 

【输出】

输出结果的最后100位,若不足100位请高位用零补足。

 

【样例输入输出】

trade.in

trade.out

2 3
4
3
2

1

0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000026

 

 

【数据规模】

对20%的数据,n<=10;
对50%的数据,n<=200;
对100%的数据,n<=100000;

 

/******************************************************************************************************
 ** Copyright (C) 2011.07.01-2013.07.01
 ** Author: famousDT <[email protected]>
 ** Edit date: 2011-10-25
******************************************************************************************************/
#include <stdio.h>
#include <stdlib.h>//abs,atof(string to float),atoi,atol,atoll
#include <math.h>//atan,acos,asin,atan2(a,b)(a/b atan),ceil,floor,cos,exp(x)(e^x),fabs,log(for E),log10
#include <vector>
#include <queue>
#include <map>
#include <time.h>
#include <set>
#include <list>
#include <stack> 
#include <string>
#include <iostream>
#include <assert.h>
#include <string.h>//memcpy(to,from,count
#include <ctype.h>//character process:isalpha,isdigit,islower,tolower,isblank,iscntrl,isprll
#include <algorithm>
using namespace std;

typedef long long ll;

#define MY_PI acos(-1)
#define MY_MAX(a, b) ((a) > (b) ? (a) : (b))
#define MY_MIN(a, b) ((a) < (b) ? (a) : (b))
#define MY_MALLOC(n, type) ((type *)malloc((n) * sizeof(type)))
#define MY_ABS(a) (((a) >= 0) ? (a) : (-(a)))
#define MY_INT_MAX 0x7fffffff

/*==========================================================*\
| y = a0 + a1*x^1 + a2 * x^2 + ... + an-1 * x^(n-1) +an * x^n
| y = a0 + x*(a1 + x*(... an-3 + x*(an-2 + x*(an-1 + anx))
| 涉及到高精度加和高精度乘,但应题目要求,只需要求出最后100位 
\*==========================================================*/
int x, n;
int a[100005];
FILE *in, *out;
#define DIGIT 5
#define DEPTH 100000 
#define MAX 20000 + 1
typedef int bignum_t[MAX + 1];
void write(const bignum_t a, ostream& os = cout) { 
    int i, j;
    char s[10000];
    int index = 0;
    for (a[i = a[0]], i-- ; i; i--) 
        for (j = DEPTH / 10; j; j /= 10) 
            s[index++] = ((a[i] / j) % 10) + '0';
    s[index] = '\0';
    for (i = index - 100; i < index; ++i) printf("%c", s[i]);
    printf("\n");
}
void add(bignum_t a, const int b) { 
    a[0] = 100;
    int i = 1; 
    for (a[1] += b; a[i] >= DEPTH && i < a[0]; a[i + 1] += a[i] / DEPTH, a[i] %= DEPTH, i++); 
    for (; a[a[0]] >= DEPTH; a[a[0]+1] = a[a[0]] / DEPTH, a[a[0]] %= DEPTH, a[0]++); 
}
void mul(bignum_t a, const int b){ 
    a[0] = 100;
    int i; 
    for (a[1] *= b, i = 2; i <= a[0]; i++) { 
        a[i] *= b; 
        if (a[i - 1] >= DEPTH) 
            a[i] += a[i - 1] / DEPTH, a[i - 1] %= DEPTH; 
    } 
    for (; a[a[0]] >= DEPTH; a[a[0] + 1] = a[a[0]] / DEPTH, a[a[0]] %= DEPTH, a[0]++); 
    for (; !a[a[0]]&&a[0] > 1; a[0]--); 
}
int main()
{
    in = freopen("trade.in", "rt", stdin);
    out = freopen("trade.out", "wt", stdout);
    bignum_t ans;
    memset(ans, 0, sizeof(bignum_t));
    scanf("%d%d", &x, &n);
    int i;
    for (i = 0; i <= n; ++i) scanf("%d", &a[i]);
    add(ans, a[n]);
    for (i = n - 1; i >= 0; --i) {
        mul(ans, x);
        add(ans, a[i]);
    }
    ans[0] = 100;
    write(ans);;       
    system("pause");
    return 0;
}


你可能感兴趣的:(游戏,Date,String,File,System,float)