【BZOJ 3527】【ZJOI 2014】力
代换一下变成多项式卷积,这里是的答案是两个卷积相减,FFT求一下两个卷积就可以啦
详细的题解:http://www.cnblogs.com/iwtwiioi/p/4126284.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | #include<cmath> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int N = 500003; const double Pi = acos (- 1.0); struct cp { double r, i; cp ( double _r = 0.0, double _i = 0.0) : r(_r), i(_i) {} cp operator + ( const cp &x) const { return cp(r + x.r, i + x.i);} cp operator - ( const cp &x) const { return cp(r - x.r, i - x.i);} cp operator * ( const cp &x) const { return cp(r * x.r - i * x.i, r * x.i + i * x.r);} }; int rev[N]; cp A[N]; void DFT(cp *a, int n, int flag) { for ( int i = 0; i < n; ++i) A[rev[i]] = a[i]; for ( int i = 0; i < n; ++i) a[i] = A[i]; for ( int m = 2; m <= n; m <<= 1) { cp wn( cos (2.0 * Pi / m * flag), sin (2.0 * Pi / m * flag)); int mid = m >> 1; for ( int i = 0; i < n; i += m) { cp w(1.0); for ( int j = 0; j < mid; ++j) { cp u = a[i + j], t = a[i + j + mid] * w; a[i + j] = u + t; a[i + j + mid] = u - t; w = w * wn; } } } if (flag == -1) for ( int i = 0; i < n; ++i) a[i].r /= n; } void init( int &n) { int k = 1, L = 0; for (; k < n; k <<= 1, ++L); n = k; for ( int i = 0; i < n; ++i) { int t = i, ret = 0; for ( int j = 0; j < L; ++j) ret <<= 1, ret |= (t & 1), t >>= 1; rev[i] = ret; } } void FFT( double *x, double *y, cp *a, cp *b, int len) { for ( int i = 0; i < len; ++i) a[i].r = x[i], a[i].i = 0.0; for ( int i = 0; i < len; ++i) b[i].r = y[i], b[i].i = 0.0; DFT(a, len, 1); DFT(b, len, 1); for ( int i = 0; i < len; ++i) a[i] = a[i] * b[i]; DFT(a, len, -1); } cp a[N], b[N]; int n, len; double g[N], q[N], f[N], ans[N]; int main() { scanf ( "%d" , &n); len = (n << 1) + 1; init(len); for ( int i = 1; i <= n; ++i) scanf ( "%lf" , &q[i]); for ( int i = 1; i <= n; ++i) g[i] = 1.0 / i / i; for ( int i = 0; i < n; ++i) f[i] = q[n - i]; FFT(q, g, a, b, len); for ( int i = 1; i <= n; ++i) ans[i] = a[i].r; FFT(f, g, a, b, len); for ( int i = 1; i <= n; ++i) ans[i] -= a[n - i].r; for ( int i = 1; i <= n; ++i) printf ( "%.3lf\n" , ans[i]); return 0; } |
题面如下,BZOJ上没有题面喔:
Description
给出n个数qi,给出Fj的定义如下:
令Ei=Fi/qi,求Ei.
Input
第一行一个整数n。
接下来n行每行输入一个数,第i行表示qi。
Output
n行,第i行输出Ei。
与标准答案误差不超过1e-2即可。
Sample Input
5 4006373.885184 15375036.435759 1717456.469144 8514941.004912 1410681.345880
Sample Output
-16838672.693 3439.793 7509018.566 4595686.886 10903040.872
Hint
对于30%的数据,n≤1000。
对于50%的数据,n≤60000。
对于100%的数据,n≤100000,0<qi<1000000000。
Source
感谢nodgd放题
NOI 2017 Bless All
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 2025成都.NET开发者Connect圆满结束
· 后端思维之高并发处理方案
· 千万级大表的优化技巧
· 在 VS Code 中,一键安装 MCP Server!
· 10年+ .NET Coder 心语 ── 继承的思维:从思维模式到架构设计的深度解析