提交记录 13230


用户 题目 状态 得分 用时 内存 语言 代码长度
CaCl2 1002. 测测你的多项式乘法 Compile Error 0 0 ns 0 KB C++ 1.62 KB
提交时间 评测时间
2020-08-01 08:48:11 2020-08-01 08:48:14
//NTT 
#include<bits/stdc++.h>
using namespace std;
#define int long long
int read(){
    int ch = getchar();
    int fg = 1;
    while(!isdigit(ch)){
        if(ch=='-') fg = -1;
        ch = getchar();
    }
    int res = 0;
    while(isdigit(ch)){
        res = res * 10 + ch - '0';
        ch = getchar();
    }
    return res * fg;
}
const int mod = 998244353;
const int maxn = 2200000;
int n,m;
int s1[maxn],s2[maxn];
int ksm(int x,int y){
    int res =x,ans = 1;
    while(y){
        if(y%2) ans = (ans * res) % mod;
        res = (res * res) % mod;
        y/=2;
    }
    return ans;
}
const int w = 3;
int r[maxn] = {0};
int ce;
int invn,invw;
void NTT(int f[],int opt){
    for(int i = 0;i<ce;i++)
	    if(i<r[i]) swap(f[i],f[r[i]]);
    for(int k = 2;k<=ce;k*=2){
        int len = k/2;
        int ww = ksm((opt==1)?w:invw,(mod-1)/k);
        for(int p = 0;p<ce;p+=k){
            int res = 1;
            for(int i = 0;i<len;i++){
                int cc = (f[p+i+len] *res) %mod;
                f[p+i+len] = (f[p+i] - cc+mod) %mod;
                f[p+i] = (f[p+i] + cc) %mod;
                res = (res*ww)%mod;
            }
        }
    }
}
signed main(){
    n = read(),m = read();
    for(int i = 0;i<=n;i++) s1[i] = read();
    for(int i = 0;i<=m;i++) s2[i] = read();
    ce = 1;
    while(ce<(n+m+1)) ce<<=1;
    invn = ksm(ce,mod-2),invw =  ksm(w,mod-2);
    r[0] = 0;
    for(int i = 1;i<ce;i++) r[i] = (r[i>>1]>>1) + ((i%2)?(ce>>1):0);
    NTT(s1,1);
    NTT(s2,1);
    for(int i = 0;i<ce;i++) s1[i] = (s1[i]*s2[i])%mod;
    NTT(s1,-1);
    for(int i = 0;i<(n+m+1);i++){
    	printf("%lld ",(s1[i]*invn)%mod);
	}
    return 0;
}

CompilationN/AN/ACompile ErrorScore: N/A


Judge Duck Online | 评测鸭在线
Server Time: 2026-03-24 16:54:01 | Loaded in 0 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠