社区讨论

玄关求条,WAON #1,3,5,8

P1919【模板】高精度乘法 / A*B Problem 升级版参与者 3已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mlh9ko3j
此快照首次捕获于
2026/02/11 08:00
上周
此快照最后确认于
2026/02/11 09:05
上周
查看原帖
递归 FFT,开了long doublelong long,数组开到 1e71e7 了还是 WA。
CPP
#include<iostream>
#include<vector>
#include<cmath>
#define int long long
using namespace std;
struct comp
{
    long double real,imag;
    comp operator + (comp x) const
    {
        return {real + x.real,imag + x.imag};
    }
    comp operator - (comp x) const
    {
        return {real - x.real,imag - x.imag};
    }
    comp operator * (comp x) const
    {
        return {real * x.real - imag * x.imag,real * x.imag + imag * x.real};
    }
};
int n,m;
int t = 1;
comp f[80000007],g[80000007];
long double pi = 3.1415926535897932384626;
void fft(comp *f,int t,int inv)
{
    if(t == 1) return;
    comp a1[(t >> 1) + 5],a2[(t >> 1) + 5];
    for(int i = 0;i < t;i++)
    {
        if(i % 2) a1[(i - 1) >> 1] = f[i];
        else a2[i >> 1] = f[i];
    }
    fft(a1,t / 2,inv);
    fft(a2,t / 2,inv);
    comp root = {cos(2 * pi / t),sin(2 * pi / t) * inv};
    comp omega = {1,0};
    for(int i = 0;i < (t >> 1);i++)
    {
        f[i] = a2[i] + omega * a1[i];
        f[i + (t >> 1)] = a2[i] - omega * a1[i];
        omega = omega * root;
    }
    return;
}
signed main()
{
    string x,y;
    cin >> x >> y;
    n = x.size() - 1,m = y.size() - 1;
    for(int i = 0;i <= n;i++) f[i].real = x[n - i] - '0';
    for(int i = 0;i <= m;i++) g[i].real = y[m - i] - '0';
    while(t <= n + m + 2) t <<= 1;
    fft(f,t,1);
    fft(g,t,1);
    for(int i = 0;i < t;i++) f[i] = f[i] * g[i];
    fft(f,t,-1);
    for(int i = 0;i <= n + m;i++) f[i].real /= t,f[i].real = round(f[i].real);
    int edge = n + m;
    for(int i = 0;i <= edge;i++)
    {
        f[i + 1].real += f[i].real / 10;
        if((int)f[i + 1].real) edge = max(edge,i + 1);
        int now = f[i].real;
        now %= 10;
        f[i].real = now;
    }
    int i = edge;
    // while((int)f[i].real == 0) i--;
    for(;i >= 0;i--) cout << (int)f[i].real;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...