QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#776968#9619. 乘积,欧拉函数,求和eweWA 1185ms5920kbC++143.0kb2024-11-23 21:57:462024-11-23 21:57:48

Judging History

你现在查看的是最新测评结果

  • [2024-11-23 21:57:48]
  • 评测
  • 测评结果:WA
  • 用时:1185ms
  • 内存:5920kb
  • [2024-11-23 21:57:46]
  • 提交

answer

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

#define fopen                                   \
    freopen("E:/vscode/oi/in.txt", "r", stdin); \
    freopen("E:/vscode/oi/out.txt", "w", stdout);
#define ios                  \
    ios::sync_with_stdio(0); \
    cin.tie(0);

#define i64 long long
#define ull unsigned i64
#define pii pair<int, int>
#define pdd pair<double, double>
#define ld long double
#define ls(x) (x << 1)
#define rs(x) (x << 1 | 1)
#define lowbit(x) (x & -x)
#define de(x) cout << #x << " = " << x << '\n'
#define MAXP 20

const int N = 2e3 + 10, M = 3e3 + 10, mod = 998244353;
const double eps = 1e-12;
const double PI = acos(-1);

bool Mst;

#define int i64

const int pri[16] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53};
vector<array<int, 2>> vec[M];
int qsm(int a, int b)
{
    int res = 1;
    while (b)
    {
        if (b & 1)
            res = res * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}

int calc(int p)
{
    return (p - 1) * qsm(p, mod - 2) % mod;
}

void solve()
{
    int n;
    cin >> n;
    for (int id = 0; id < n; id++)
    {
        int x;
        cin >> x;
        int mask = 0, val = x;
        for (int i = 0; i < 16; i++)
        {
            int p = pri[i];
            if (x % p == 0)
            {
                while (x % p == 0)
                    x /= p;
                mask |= 1 << i;
            }
        }
        vec[x].push_back({mask, val});
    }
    vector<int> dp(1 << 17, 0);
    vector<int> f(1 << 16, 1), g(16);
    for (int i = 0; i < 16; i++)
        g[i] = calc(pri[i]);

    for (int x = 0; x < (1 << 16); x++)
    {
        for (int i = 0; i < 16; i++)
            if (x >> i & 1)
                f[x] = f[x] * g[i] % mod;
    }

    dp[0] = 1;
    for (int p = 1; p < M; p++)
    {
        if (vec[p].empty())
            continue;
        for (auto [mask, val] : vec[p])
        {
            auto ndp = dp;
            if (p > 1)
                mask |= 1 << 16;
            int maxp = calc(p);
            for (int i = 0; i < (1 << 17); i++)
            {
                int j = i | mask, k = j ^ i;
                int res = dp[i] * val % mod;
                if (k >> 16 & 1)
                {
                    res = res * maxp % mod;
                    k ^= 1 << 16;
                }
                res = res * f[k] % mod;
                ndp[j] = (ndp[j] + res) % mod;
            }
            dp = ndp;
        }
        for (int i = 1 << 16; i < (1 << 17); i++)
            dp[i] = 0;
    }
    int ans = 0;
    for (auto x : dp)
        ans = (ans + x) % mod;
    cout << ans << '\n';
}

bool Med;

signed main()
{
    ios;
    // fopen;
    cerr << (&Med - &Mst) / 1024 / 1024;

    int t = 1;
    srand(time(0));
    cout << fixed << setprecision(12);

    // cin >> t;
    for (int i = 1; i <= t; i++)
    {
        solve();
    }

    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 9ms
memory: 5772kb

input:

5
1 6 8 6 2

output:

892

result:

ok single line: '892'

Test #2:

score: 0
Accepted
time: 9ms
memory: 5920kb

input:

5
3 8 3 7 8

output:

3157

result:

ok single line: '3157'

Test #3:

score: -100
Wrong Answer
time: 1185ms
memory: 5800kb

input:

2000
79 1 1 1 1 1 1 2803 1 1 1 1 1 1 1609 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2137 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 613 1 499 1 211 1 2927 1 1 1327 1 1 1123 1 907 1 2543 1 1 1 311 2683 1 1 1 1 2963 1 1 1 641 761 1 1 1 1 1 1 1 1 1 1 1 1489 2857 1 1 1 1 1 1 1 1 1 1 1 1 1 967 1 821 1 1 1 1 2143 1861...

output:

318794818

result:

wrong answer 1st lines differ - expected: '50965652', found: '318794818'