提交记录 28895


用户 题目 状态 得分 用时 内存 语言 代码长度
1111 1002i. 【模板题】多项式乘法 Unknown 0 0 ns 0 KB C++ 1.63 KB
提交时间 评测时间
2026-02-13 16:35:46 N/A
#pragma GCC target("avx512f")
#include <vector>
#include <algorithm>

using namespace std;

unsigned brev[2097160];

constexpr unsigned long long qpow(unsigned long long x, unsigned long long y)
{
    unsigned long long p = x, ans = 1;
    do
    {
        if(y & 1) ans = ans * p % 998244353;
        p = p * p % 998244353;
    } while (y >>= 1);
    return ans;
}

void FFT(unsigned n, unsigned long long *F, bool vv)
{
    for(unsigned i=0;i<n;i++)
    {
        swap(F[i], F[brev[i]]);
    }
    unsigned long long gr = vv ? 3 : 332748118;
    for(unsigned i=1;i<n;i<<=1)
    {
        unsigned long long cp = qpow(gr, 998244352 / (i * 2));
        for(unsigned j=0;j<n;j+=i*2)
        {
            unsigned long long v = 1;
            for(unsigned k=0;k<i;k++)
            {
                const unsigned long long x = F[j + k], y = v * F[j + k + i] % 998244353;
                F[j + k] = (x + y) % 998244353;
                F[j + k + i] = (x - y + 998244353) % 998244353;
                v = v * cp % 998244353;
            }
        }
    }
}
void poly_multiply(unsigned *F, int n, unsigned *G, int m, unsigned *c)
{
    unsigned pl = __lg(n + m + 2), p = (1 << pl) == n + m + 2 ? 1 << pl : (1 << ++pl);
    for(unsigned i=0;i<p;i++)
    {
        brev[i] = (brev[i >> 1] >> 1) | ((i & 1) << (pl - 1));
    }
    for(unsigned i=0;i<p;i++)
    {
        if(i > brev[i]) brev[i] = i;
    }
    FFT(p, F, 1);
    FFT(p, G, 1);
    for(unsigned i=0;i<p;i++)
    {
        c[i] = F[i] * G[i] % 998244353;
    }
    FFT(p, c, 0);
    unsigned long long pr = qpow(p, 998244351);
    for(unsigned i=0;i<=n+m;i++)
    {
        c[i] = c[i] * pr % 998244353;
    }
}


Judge Duck Online | 评测鸭在线
Server Time: 2026-02-15 05:57:50 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠