求助 !QWQ WA#6,质因数分解做法。。
查看原帖
求助 !QWQ WA#6,质因数分解做法。。
643323
weirdoX楼主2023/11/21 09:41
#include <bits/stdc++.h>
using namespace std;
#define rep(i,l,r) for (int i = (l); i <= (r); i++)
#define per(i,r,l) for (int i = (r); i >= (l); i--)
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
#define maxn(a, b) a = max(a, b)
#define minn(a, b) a = min(a, b)
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
typedef double db;
// const ll mod = (ll)1e18 + 3;
ll rp(ll a,ll b) {ll res=1; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a;a=a*a;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}

const int N = 154;
int n;
int d[N], cnt[N];
bool b[N];

int main() {
    scanf("%d", &n);
    b[1] = true;
    rep(i,2,N-1) if(!b[i]) rep(j,i,N/i) {
        b[i*j]=true;
    }
    ll sum = 0;
    rep(i,1,n) {
        scanf("%d", &d[i]);
        sum += d[i] - 1;
    }
    if (n == 1 && d[1] == 0) return puts("1"), 0;
    if (sum != n - 2) return puts("0"), 0;
    rep(i,1,n) if (!d[i]) return puts("0"), 0;

    auto add = [&](const int &x, const int &c) {
        rep(i,1,n) if (!b[i]) {
            for (int s = i, t = 1; s <= n; s *= i, t++) {
                cnt[i] += c * (x / s) * t;
            }
        }
    };

    add(n - 2, 1);
    rep(i,1,n) add(d[i] - 1, -1);

    ll ans = 1;
    rep(i,1,n) if (!b[i]) {
        assert(cnt[i] >= 0);
        ans *= rp(i, cnt[i]);
        assert(ans <= 1e17);
    }
    printf("%lld\n", ans);
    return 0;
}
2023/11/21 09:41
加载中...