经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C++ » 查看文章
BZOJ3527: [Zjoi2014]力(FFT)
来源:cnblogs  作者:自为风月马前卒  时间:2018/11/28 9:54:39  对本文有异议

题意

题目链接

Sol

直接把\(q_i\)除掉

那么\(E_j = \sum_{i = 1}^{j - 1} q_i \frac{1}{(i - j)^2} - \sum_{i = j + 1}^n q_i \frac{1}{(i - j)^2}\)

\(f_i = q_i, g_i = \frac{1}{i^2}\)

带入原式发现原式变成了卷积的形式

\(E_j = f_i g_{i - j}\)

然后像\(BZOJ2194\)那样把\(g\)给翻转掉,就成了标准卷积形式

FFT一波

  1. // luogu-judger-enable-o2
  2. #include<bits/stdc++.h>
  3. const double Pi = acos(-1);
  4. using namespace std;
  5. const int MAXN = 1e6 + 10;
  6. int N, M, r[MAXN];
  7. struct com {
  8. double x, y;
  9. com(double xx = 0, double yy = 0) {x = xx; y = yy;}
  10. com operator + (com &rhs) {
  11. return com(x + rhs.x, y + rhs.y);
  12. }
  13. com operator - (com &rhs) {
  14. return com(x - rhs.x, y - rhs.y);
  15. }
  16. com operator * (com &rhs) {
  17. return com(x * rhs.x - y * rhs.y, x * rhs.y + y * rhs.x);
  18. }
  19. }a[MAXN], b[MAXN], c[MAXN];
  20. void FFT(com *a, int N, int type) {
  21. for(int i = 0; i < N; i++) if(i < r[i]) swap(a[i], a[r[i]]);
  22. for(int mid = 1; mid < N; mid <<= 1) {
  23. com Wn(cos(Pi / mid), type * sin(Pi / mid));
  24. for(int R = mid << 1, j = 0; j < N; j += R) {//这里要写<N
  25. com w(1, 0);
  26. for(int k = 0; k < mid; k++, w = w * Wn) {
  27. com x = a[j + k], y = w * a[j + k + mid];
  28. a[j + k] = x + y;
  29. a[j + k + mid] = x - y;
  30. }
  31. }
  32. }
  33. if(type == -1) {
  34. for(int i = 0; i <= N; i++) a[i].x /= N;
  35. }
  36. }
  37. int Mul(com *c, com *a, com *b, int N, int M) {
  38. int ret = 1, l = 0;
  39. while(ret <= N + M) ret <<= 1, l++;
  40. for(int i = 0; i < ret; i++) r[i] = (r[i >> 1] >> 1) | ((i & 1) << l - 1);
  41. FFT(a, ret, 1);
  42. FFT(b, ret, 1);
  43. for(int i = 0; i <= ret; i++) c[i] = a[i] * b[i];
  44. FFT(c, ret, -1);
  45. return ret;
  46. }
  47. int main() {
  48. scanf("%d", &N); N -= 1;
  49. for(int i = 0; i <= N; i++) scanf("%lf", &a[i].x);
  50. for(int i = 0; i < N; i++) b[i].x = -1.0 / (double)(N - i) / (double)(N - i);
  51. for(int i = N + 1; i <= 2 * N; i++) b[i].x = -b[2 * N - i].x;
  52. Mul(c, a, b, N, 2 * N);
  53. for(int i = N; i <= N * 2; i++) printf("%.5lf\n", c[i].x);
  54. return 0;
  55. }
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号