boxmoe_header_banner_img

でも夢はきらめない。

文章导读

NOI1998 阶乘之和


avatar
akitama 2025年2月24日 146

NOI1998 阶乘之和

题目

题目链接

代码

#include<iostream>
#include<cstring>
using namespace std;

#define akitama return 0
#define ll long long

const int MAXN = 1001;
int a[MAXN], b[MAXN], c[MAXN], sum[MAXN];

void mul() {
    memset(c, 0, sizeof(c));
    for (int i = 1000; i >= 0; --i) {
        for (int j = 1000; j >= 0; --j) {
            if (a[i] && b[j]) c[i + j - 1000] += a[i] * b[j];
        }
    }
    for (int i = 1000; i > 0; --i) {
        if (c[i] >= 10) {
            c[i - 1] += c[i] / 10;
            c[i] %= 10;
        }
    }
}

void add() {
    for (int i = 1000; i >= 0; --i) {
        sum[i] += a[i];
        if (sum[i] >= 10) {
            sum[i - 1] += sum[i] / 10;
            sum[i] %= 10;
        }
    }
}

void solve() {
    memset(a, 0, sizeof(a));
    memset(b, 0, sizeof(b));
    memset(c, 0, sizeof(c));
    memset(sum, 0, sizeof(sum));
    a[1000] = 1;
    int n;
    cin >> n;
    for (int i = 1; i <= n; ++i) {
        memset(b, 0, sizeof(b));
        int x = i, idx = 1000;
        while (x) {
            b[idx--] = x % 10;
            x /= 10;
        }
        mul();
        memcpy(a, c, sizeof(a));
        add();
    }
    int start_idx = 0;
    while (start_idx < 1001 && sum[start_idx] == 0) start_idx++;
    for (int i = start_idx; i < 1001; ++i) cout << sum[i];
    cout << endl;
}

signed main() {
    cin.tie(nullptr)->ios::sync_with_stdio(false);
    solve();
    akitama;
}



评论(已关闭)

评论已关闭