社区讨论
玄关求条,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,开了
CPPlong double 和 long long,数组开到 了还是 WA。#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 条回复,欢迎继续交流。
正在加载回复...