1258 序列求和 V4

题意:求\(S_m(n) = \sum_{i=1}^n i^m \mod 10^9+7\),多组数据,\(T \le 500, n \le 10^{18}, k \le 50000\)


等幂求和

多项式求逆元\(O(mlogm)\)预处理伯努利数,然后可以\(O(m)\)回答

因为是任意模数,所以要用拆系数fft

拆系数fft+多项式求逆元,写的爽死了

具体内容可能会写学习笔记


注意:

  1. 多项式求逆元里拆系数,不能只更新 .x= ,这样的话y还保留以前的值就错了
  2. 因为使用指数型生成函数预处理伯努利数,所以最后要乘个阶乘


不知道为什么我的代码好快啊,500ms rank1

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. using namespace std;
  7. typedef long long ll;
  8. const int N = (1<<17) + 5, mo = 1e9+7, P = 1e9+7;
  9. const double PI = acos(-1.0);
  10. inline ll read(){
  11. char c=getchar(); ll x=0,f=1;
  12. while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();}
  13. while(c>='0'&&c<='9') {x=x*10+c-'0';c=getchar();}
  14. return x*f;
  15. }
  16. struct meow{
  17. double x, y;
  18. meow(double a=0, double b=0):x(a), y(b){}
  19. };
  20. meow operator +(meow a, meow b) {return meow(a.x+b.x, a.y+b.y);}
  21. meow operator -(meow a, meow b) {return meow(a.x-b.x, a.y-b.y);}
  22. meow operator *(meow a, meow b) {return meow(a.x*b.x-a.y*b.y, a.x*b.y+a.y*b.x);}
  23. meow conj(meow a) {return meow(a.x, -a.y);}
  24. typedef meow cd;
  25. namespace fft {
  26. int rev[N], maxlen = 1<<17;
  27. cd omega[N], omegaInv[N];
  28. void init() {
  29. for(int i=0; i<maxlen; i++) {
  30. omega[i] = cd(cos(2*PI/maxlen*i), sin(2*PI/maxlen*i));
  31. omegaInv[i] = conj(omega[i]);
  32. }
  33. }
  34. void dft(cd *a, int n, int flag) {
  35. cd *w = flag==1 ? omega : omegaInv;
  36. for(int i=0; i<n; i++) if(i < rev[i]) swap(a[i], a[rev[i]]);
  37. for(int l=2; l<=n; l<<=1) {
  38. int m = l>>1;
  39. for(cd *p = a; p != a+n; p += l)
  40. for(int k=0; k<m; k++) {
  41. cd t = w[maxlen/l*k] * p[k+m];
  42. p[k+m] = p[k] - t;
  43. p[k] = p[k] + t;
  44. }
  45. }
  46. if(flag == -1) for(int i=0; i<n; i++) a[i].x /= n;
  47. }
  48. cd a[N], b[N], c[N], d[N]; int z[N];
  49. void inverse(int *x, int *y, int l) {
  50. if(l == 1) {y[0] = 1; return;}
  51. inverse(x, y, (l+1)>>1);
  52. int n = 1, k = 0; while(n < l<<1) n<<=1, k++;
  53. for(int i=0; i<n; i++) rev[i] = (rev[i>>1]>>1) | ((i&1)<<(k-1));
  54. for(int i=0; i<l; i++) a[i] = cd(y[i]>>15), b[i] = cd(y[i]&32767);
  55. for(int i=l; i<n; i++) a[i] = b[i] = cd();
  56. dft(a, n, 1); dft(b, n, 1);
  57. for(int i=0; i<n; i++) {
  58. cd _a = a[i], _b = b[i];
  59. a[i] = _a * _a;
  60. b[i] = _a * _b + _a * _b;
  61. c[i] = _b * _b;
  62. }
  63. dft(a, n, -1); dft(b, n, -1); dft(c, n, -1);
  64. for(int i=0; i<l; i++)
  65. z[i] = ( (ll(a[i].x + 0.5) %mo << 30) %mo + (ll(b[i].x + 0.5) %mo << 15) %mo + ll(c[i].x + 0.5) %mo) %mo;
  66. for(int i=0; i<l; i++)
  67. a[i] = cd(x[i]>>15), b[i] = cd(x[i]&32767), c[i] = cd(z[i]>>15), d[i] = cd(z[i]&32767);
  68. for(int i=l; i<n; i++) a[i] = b[i] = c[i] = d[i] = cd();
  69. dft(a, n, 1); dft(b, n, 1); dft(c, n, 1); dft(d, n, 1);
  70. for(int i=0; i<n; i++) {
  71. cd _a = a[i], _b = b[i], _c = c[i], _d = d[i];
  72. a[i] = _a * _c;
  73. b[i] = _a * _d + _b * _c;
  74. c[i] = _b * _d;
  75. }
  76. dft(a, n, -1); dft(b, n, -1); dft(c, n, -1);
  77. for(int i=0; i<l; i++) {
  78. ll t = ( (ll(a[i].x + 0.5) %mo << 30) %mo + (ll(b[i].x + 0.5) %mo << 15) %mo + ll(c[i].x + 0.5) %mo) %mo;
  79. y[i] = (y[i] * 2 %mo - t + mo) %mo;
  80. }
  81. }
  82. }
  83. int n, m, a[N], b[N];
  84. ll inv[N], fac[N], facInv[N], mi[N];
  85. inline ll C(int n, int m) {return fac[n] * facInv[m] %mo * facInv[n-m] %mo;}
  86. inline ll cal(int n, int m) {
  87. ll ans = 0;
  88. mi[0] = 1; for(int i=1; i<=m+1; i++) mi[i] = mi[i-1] * n %mo;
  89. for(int i=0; i<=m; i++) if(b[i]) (ans += C(m+1, i) * b[i] %mo * mi[m+1-i] %mo) %= mo;
  90. ans = (ans * inv[m+1]) %mo;
  91. return ans;
  92. }
  93. int main() {
  94. freopen("in", "r", stdin);
  95. n = 50001;
  96. inv[1] = fac[0] = facInv[0] = 1;
  97. for(int i=1; i<=n; i++) {
  98. if(i != 1) inv[i] = (P - P/i) * inv[P%i] %P;
  99. fac[i] = fac[i-1] * i %P;
  100. facInv[i] = facInv[i-1] * inv[i] %P;
  101. }
  102. fft::init();
  103. for(int i=0; i<n; i++) a[i] = facInv[i+1];
  104. fft::inverse(a, b, n);
  105. for(int i=0; i<n; i++) b[i] = b[i] * fac[i] %mo;
  106. int T=read();
  107. while(T--) {
  108. n = (read()+1) %mo; m=read();
  109. printf("%lld\n", cal(n, m));
  110. }
  111. }

51NOD 1258 序列求和 V4 [任意模数fft 多项式求逆元 伯努利数]的更多相关文章

  1. 51nod 1258 序列求和 V4

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1258 1258 序列求和 V4  基准时间限制:8 秒 空间限制:131 ...

  2. BZOJ1042 HAOI2008硬币购物(任意模数NTT+多项式求逆+生成函数/容斥原理+动态规划)

    第一眼生成函数.四个等比数列形式的多项式相乘,可以化成四个分式.其中分母部分是固定的,可以多项式求逆预处理出来.而分子部分由于项数很少,询问时2^4算一下贡献就好了.这个思路比较直观.只是常数巨大,以 ...

  3. 【51Nod1258】序列求和V4(FFT)

    [51Nod1258]序列求和V4(FFT) 题面 51Nod 多组数据,求: \[Ans=\sum_{i=1}^ni^k,n\le 10^{18},k\le50000\] 题解 预处理伯努利数,时间 ...

  4. 51nod 1172 Partial Sums V2 卡精度的任意模数FFT

    卡精度的任意模数fft模板题……这道题随便写个表就能看出规律来(或者说考虑一下实际意义),反正拿到这题之后,很快就会发现他是任意模数fft模板题.然后我就去网上抄了一下板子……我打的是最土的任意模数f ...

  5. 【集训队作业2018】取名字太难了 任意模数FFT

    题目大意 求多项式 \(\prod_{i=1}^n(x+i)\) 的系数在模 \(p\) 意义下的分布,对 \(998244353\) 取模. \(p\) 为质数. \(n\leq {10}^{18} ...

  6. 任意模数FFT

    任意模数FFT 这是一个神奇的魔法,但是和往常一样,在这之前,先 \(\texttt{orz}\ \color{orange}{\texttt{matthew99}}\) 问题描述 给定 2 个多项式 ...

  7. 51nod 1228、1258 序列求和

    这里一次讲两题...貌似都是板子? 所以两题其实可以一起做 [雾 noteskey 总之就是伯努利数的两道入门题啦,就是第二道有点鬼畜了,居然要任意模数的!(好吧是 1e9+7 但也没什么区别了) 伯 ...

  8. 拆系数FFT(任意模数FFT)

    拆系数FFT 对于任意模数 \(mod\) 设\(m=\sqrt {mod}\) 把多项式\(A(x)\)和\(B(x)\)的系数都拆成\(a\times m+b\)的形式,时\(a, b\)都小于\ ...

  9. 51nod1258 序列求和 V4(伯努利数+多项式求逆)

    题面 传送门 题解 不知道伯努利数是什么的可以先去看看这篇文章 多项式求逆预处理伯努利数就行 因为这里模数感人,所以得用\(MTT\) //minamoto #include<bits/stdc ...

随机推荐

  1. Java IO学习笔记(三)转换流、数据流、字节数组流

    转换流 1.转换流:将字节流转换成字符流,转换之后就可以一个字符一个字符的往程序写内容了,并且可以调用字符节点流的write(String s)方法,还可以在外面套用BufferedReader()和 ...

  2. SpringMvc多视图配置(jsp、velocity、freemarker) 在src目录views.properties配置

    #welcome为modelAndView.setViewName(" welcome " ) ; 中的welcome .(class)固定写法 welcome.(class)=o ...

  3. c#Message多功能用法

     1.   当要显示如图3个按钮时,并要获得单击不同按钮的进行不同的相应时,可以在MessageBoxButtons后面添加一个.(应该英文的点,此处为了醒目,用中文代替)可以看到提示框下方需要几个按 ...

  4. 使用gulp实现文件压缩及浏览器热加载

    一.安装gulp 首先,你要安装过nodejs,如果没有安装过的同学请自行下载.  先再命令行里输入   npm install gulp -g   下载gulp 二.创建gulp项目 创建一个你需要 ...

  5. Java纸牌小demo以及日历小demo

    //卡牌类 public class Card { //定义卡牌的点数 public static final String[] cardName = { "3", "4 ...

  6. Java 9 揭秘(12. Process API 更新)

    Tips 做一个终身学习的人. 在本章中,主要介绍以下内容: Process API是什么 如何创建本地进程 如何获取新进程的信息 如何获取当前进程的信息 如何获取所有系统进程的信息 如何设置创建,查 ...

  7. Android - Daydream 互动屏保

    Android Daydream 互动屏保 API19 API23 Create:2016-03-01 继承DreamService来实现一个自定义屏保 Dreams是当充电的设备空闲,或者插入底座时 ...

  8. sqlserver提高篇续集

    七.数据完整性 1.概念:数据一致性和准确性. 分类:域完整性.实体完整性.引用完整性. 解析:域完整性也叫列完整性是指一个数据集对某个列是否有效和确定是否允许为空值.实体完整性也叫行完整性 要求所有 ...

  9. NOIP2011玛雅游戏

    闲的没事干,出来写一下早两天刷的一道搜索题NOIP2011玛雅游戏,其实这道题还是比较水的,虽然看起来可能有点复杂. 方法很简单粗暴,直接根据规则模拟就行. 话不多说直接上代码(关键操作在注释中有提到 ...

  10. Docker网络——单host网络

    前言 前面总结了Docker基础以及Docker存储相关知识,今天来总结一下Docker单主机网络的相关知识.毋庸置疑,网络绝对是任何系统的核心,他在Docker中也占有重要的作用.同样本文基于Clo ...