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

题面

51Nod

多组数据,求:

\[Ans=\sum_{i=1}^ni^k,n\le 10^{18},k\le50000
\]

题解

预处理伯努利数,时间复杂度\(O(nlogn)\)

然后利用伯努利数求和即可。

\[\sum_{i=1}^n i^k=\frac{1}{k+1}\sum_{i=0}^kB_iC_{k+1}^i(n+1)^{k+1-i}
\]

预处理需要多项式求逆,因为模数不太好,所以需要\(MTT\)

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<set>
  8. #include<map>
  9. #include<vector>
  10. #include<queue>
  11. using namespace std;
  12. #define ll long long
  13. #define RG register
  14. #define MOD 1000000007
  15. #define MAX 150000
  16. const int NN=50000;
  17. const int M=sqrt(MOD);
  18. const double Pi=acos(-1);
  19. inline ll read()
  20. {
  21. RG ll x=0,t=1;RG char ch=getchar();
  22. while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
  23. if(ch=='-')t=-1,ch=getchar();
  24. while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
  25. return x*t;
  26. }
  27. int fpow(int a,int b){int s=1;while(b){if(b&1)s=1ll*s*a%MOD;a=1ll*a*a%MOD;b>>=1;}return s;}
  28. struct Complex{double a,b;}W[MAX],A1[MAX],A2[MAX],B1[MAX],B2[MAX],X[MAX],Y[MAX],Z[MAX];
  29. Complex operator+(Complex a,Complex b){return (Complex){a.a+b.a,a.b+b.b};}
  30. Complex operator-(Complex a,Complex b){return (Complex){a.a-b.a,a.b-b.b};}
  31. Complex operator*(Complex a,Complex b){return (Complex){a.a*b.a-a.b*b.b,a.b*b.a+a.a*b.b};}
  32. int r[MAX],N,l;
  33. void FFT(Complex *P,int N,int opt)
  34. {
  35. for(int i=0;i<N;++i)if(i<r[i])swap(P[i],P[r[i]]);
  36. for(int i=1;i<N;i<<=1)
  37. for(int p=i<<1,j=0;j<N;j+=p)
  38. for(int k=0;k<i;++k)
  39. {
  40. Complex w=(Complex){W[N/i*k].a,W[N/i*k].b*opt};
  41. Complex X=P[j+k],Y=P[i+j+k]*w;
  42. P[j+k]=X+Y;P[i+j+k]=X-Y;
  43. }
  44. if(opt==-1)for(int i=0;i<N;++i)P[i].a/=N;
  45. }
  46. void MTT(int *a,int *b,int len,int *c)
  47. {
  48. memset(A1,0,sizeof(A1));memset(B1,0,sizeof(B1));
  49. memset(A2,0,sizeof(A2));memset(B2,0,sizeof(B2));
  50. for(N=1,l=0;N<=len;N<<=1)++l;
  51. for(int i=0;i<N;++i)r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));
  52. for(int i=1;i<N;i<<=1)
  53. for(int k=0;k<i;++k)W[N/i*k]=(Complex){cos(k*Pi/i),sin(k*Pi/i)};
  54. for(int i=0;i<len;++i)a[i]%=MOD,b[i]%=MOD;
  55. for(int i=0;i<len;++i)A1[i].a=a[i]/M,A2[i].a=a[i]%M;
  56. for(int i=0;i<len;++i)B1[i].a=b[i]/M,B2[i].a=b[i]%M;
  57. memset(X,0,sizeof(X));memset(Y,0,sizeof(Y));memset(Z,0,sizeof(Z));
  58. FFT(A1,N,1);FFT(A2,N,1);FFT(B1,N,1);FFT(B2,N,1);
  59. for(int i=0;i<N;++i)
  60. {
  61. X[i]=A1[i]*B1[i];
  62. Y[i]=A1[i]*B2[i]+A2[i]*B1[i];
  63. Z[i]=A2[i]*B2[i];
  64. }
  65. FFT(X,N,-1);FFT(Y,N,-1);FFT(Z,N,-1);
  66. for(int i=0;i<len;++i)
  67. {
  68. int ans=0;
  69. ans=(ll)(X[i].a+0.5)%MOD*M%MOD*M%MOD;
  70. ans=(ans+(ll)(Y[i].a+0.5)%MOD*M)%MOD;
  71. ans=(ans+(ll)(Z[i].a+0.5))%MOD;
  72. c[i]=ans;
  73. }
  74. }
  75. int c[MAX],d[MAX];
  76. void Inv(int *a,int *b,int len)
  77. {
  78. if(len==1){b[0]=fpow(a[0],MOD-2);return;}
  79. Inv(a,b,len>>1);
  80. MTT(a,b,len,c);MTT(b,c,len,d);
  81. for(int i=0;i<len;++i)b[i]=(b[i]+b[i])%MOD;
  82. for(int i=0;i<len;++i)b[i]=(b[i]+MOD-d[i])%MOD;
  83. }
  84. int a[MAX];
  85. int n,B[MAX],jc[MAX],jv[MAX],inv[MAX];
  86. int C(int n,int m){return 1ll*jc[n]*jv[m]%MOD*jv[n-m]%MOD;}
  87. int main()
  88. {
  89. B[0]=jc[0]=jv[0]=inv[0]=inv[1]=1;
  90. for(int i=2;i<=NN+NN;++i)inv[i]=1ll*inv[MOD%i]*(MOD-MOD/i)%MOD;
  91. for(int i=1;i<=NN+NN;++i)jc[i]=1ll*jc[i-1]*i%MOD;
  92. for(int i=1;i<=NN+NN;++i)jv[i]=1ll*jv[i-1]*inv[i]%MOD;
  93. for(int i=0;i<=NN;++i)a[i]=jv[i+1];
  94. Inv(a,B,1<<16);
  95. for(int i=0;i<=NN;++i)B[i]=1ll*B[i]*jc[i]%MOD;
  96. int T=read();
  97. while(T--)
  98. {
  99. int n=read()%MOD,k=read(),ans=0,nw=n+1;
  100. for(int i=k;~i;--i,nw=1ll*nw*(n+1)%MOD)ans=(ans+1ll*C(k+1,i)*B[i]%MOD*nw)%MOD;
  101. ans=1ll*ans*inv[k+1]%MOD;
  102. printf("%d\n",ans);
  103. }
  104. return 0;
  105. }

【51Nod1258】序列求和V4(FFT)的更多相关文章

  1. 51nod1258 序列求和V4

    T(n) = n^k,S(n) = T(1) + T(2) + ...... T(n).给出n和k,求S(n).   例如k = 2,n = 5,S(n) = 1^2 + 2^2 + 3^2 + 4^ ...

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

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

  3. 51NOD 1258 序列求和 V4 [任意模数fft 多项式求逆元 伯努利数]

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

  4. 51nod 1258 序列求和 V4

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

  5. HDU 5358 First One 求和(序列求和,优化)

    题意:给定一个含n个元素的序列,求下式子的结果.S(i,j)表示为seq[i...j]之和.注:对于log20可视为1.数据量n<=105. 思路:即使能够在O(1)的时间内求得任意S,也是需要 ...

  6. HDU 2254 奥运(矩阵高速幂+二分等比序列求和)

    HDU 2254 奥运(矩阵高速幂+二分等比序列求和) ACM 题目地址:HDU 2254 奥运 题意:  中问题不解释. 分析:  依据floyd的算法,矩阵的k次方表示这个矩阵走了k步.  所以k ...

  7. 51nod_1236_序列求和 V3 _组合数学

    51nod_1236_序列求和 V3 _组合数学 Fib(n)表示斐波那契数列的第n项,Fib(n) = Fib(n-1) + Fib(n-2).Fib(0) = 0, Fib(1) = 1. (1, ...

  8. HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和)

    HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和) ACM 题目地址:HDU 1588 Gauss Fibonacci 题意:  g(i)=k*i+b;i为变量.  给出 ...

  9. lqb 入门训练 序列求和 (PS:用长整数做数据的输入输出)

    入门训练 序列求和 时间限制:1.0s   内存限制:256.0MB     问题描述 求1+2+3+...+n的值. 输入格式 输入包括一个整数n. 输出格式 输出一行,包括一个整数,表示1+2+3 ...

随机推荐

  1. 二分查找的C#实现

    二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法.但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列. 查找过程 首先,假设表中元素是按升序排列, ...

  2. PowerDesigner 15学习笔记:十大模型及五大分类

    个人认为PowerDesigner 最大的特点和优势就是1)提供了一整套的解决方案,面向了不同的人员提供不同的模型工具,比如有针对企业架构师的模型,有针对需求分析师的模型,有针对系统分析师和软件架构师 ...

  3. Intellif IDEA 自带数据库管理工具 DataBase 配置

    第一步: 第二步: 第三步: jdbc:oracle:thin:@192.168.19.39:1521:orcl

  4. Intellij IDEA破解激活

    本文使用破解补丁激活Intellij IDEA 第一步:下载破解补丁(http://idea.lanyus.com/) 第二步:将下载好的补丁放置磁盘的任意位置,下面是我放置的位置 第三步:打开Int ...

  5. appium+python自动化☞appium python api大全

    整理了一些常用的appium python api,供学习使用...

  6. JAVA基础学习之路(十一)引用传递

    引用传递: 不同栈内存可以指向同一块堆内存,不同栈内存可以对一块堆内存进行修改 范例一: class Message { private int num = 10; public Message(in ...

  7. POWERDESIGNER生成的代码有引号

    昨天在用powerdesigner画的一个导入ORACLE中.发现都带了双引号, 当时没在意,以为是分隔符.那想后要在ORACLE查询表是一定要输入双引号才能查询.. 后来才知道而这在oracle 中 ...

  8. SAP(ABAP) ABAP内部外部数据转换常用function

    文本相关CONVERSION_EXIT_CUNIT_OUTPUT      将内部单位转为单位文本CONVERSION_EXIT_ISOLA_OUTPUT      根据语言代码取文本CONVERSI ...

  9. C# 钱数 小写 转 大写

    public class Rmb { /// <summary> /// 转换人民币大小金额 /// </summary> /// <param name="n ...

  10. Week4_Linux书本一二两章

    第一章的学习内容就是对Linux内核有一个基本的了解,同时知道一些关于Linux的知识. 学习Linux,可以自己有一台装有Linux操作系统的机器,源代码的作用无可替代: Linux发展历程简介:L ...