Very Easy

· · 题解

这道题纯纯简单 高精

唯一难点就是看懂题目的这个点。

给定 na,请求出:

\sum\limits_{i=1}^{n}i\times a^i

这究竟是什么意思?

其实就是:对于给定的 na,每次累加这个答案:

a^i \times i

附上一种模板级,超方便的新写法。

它叫:重载运算符。与其说它是他是重载运算符,不如说它是把高精的所有操作封装起来了,注释在代码。

code

# include <bits/stdc++.h>
using namespace std;

const int N = 4e2 + 10;

int n, base;

struct longnum{
    int l, d[N];

    longnum(){} // 重载标志 

    longnum(int a){ // 赋值操作 
        l = 0;
        do d[++ l] = a % 10, a /= 10; while(a);
    }

    longnum(string a){ // 把字符串转化为数字 
        l = a.size();
        for(int i = 1; i <= l; i ++) d[i] = a[l - i] - '0';
    }

    longnum operator + (longnum oth){ // 重载加法运算 
        longnum t;
        t.l = max(l, oth.l) + 1;
        for(int i = l + 1; i <= t.l; i ++) d[i] = 0;
        for(int i = oth.l + 1; i <= t.l; i ++) oth.d[i] = 0; // 以上是清空 

        int num = 0;
        for(int i = 1; i <= t.l; i ++){
            t.d[i] = d[i] + oth.d[i] + num;
            num = t.d[i] / 10;
            t.d[i] %= 10;
        } // 边计算边进位(很简单) 

        while(t.l > 1 && t.d[t.l] == 0) t.l --; // 去前缀0 

        return t; // 一定要返回结果 
    }

    longnum operator * (longnum oth){ // 重载乘法运算 
        longnum t;
        t.l = l + oth.l + 1;
        for(int i = 1; i <= t.l; i ++) t.d[i] = 0;
        for(int i = l + 1; i <= t.l; i ++) d[i] = 0;
        for(int i = oth.l + 1; i <= t.l; i ++) oth.d[i] = 0; // 以上是清空 

        for(int i = 1; i <= l; i ++)
            for(int j = 1; j <= oth.l; j ++)
                t.d[i + j - 1] += d[i] * oth.d[j]; // i + j - 1 要注意想 
        /* 我是先累加的,下面才是进位,这是整个代码最难想的,建议用纸笔模拟*/

        int num = 0;
        for(int i = 1; i <= t.l; i ++){
            t.d[i] += num;
            num = t.d[i] / 10;
            t.d[i] %= 10;
        } // 进位 

        while(t.l > 1 && t.d[t.l] == 0) t.l --; // 去前缀0

        return t; // 一定要返回 
    }

    friend ostream& operator << (ostream &out, longnum a){ // 重载高精度输出流
        for(int i = a.l; i >= 1; i --) out << a.d[i];
        out << "\n";

        return out;
    }

    friend istream& operator >> (istream &in, longnum &a){ // 重载高精度输入流 
        string s;
        in >> s;
        a = s;

        return in;
    }
}B, ans;

int main(){
    while(cin >> n){ // 模拟 
        scanf("%d", &base); // 底数 
        ans = 0; // 答案 
        B = 1; // i次幂 
        for(int i = 1; i <= n; i ++){ // 计算答案 
            B = B * base;
            ans = ans + B * i;
        }

        cout << ans;
    }

    return 0;
}

强烈建议掌握这种写法,太实用了。

最后:别抄题解!别抄题解!别抄题解!