51nod 1228 序列求和

伯努利数,刚!

自然数幂和神犇的blog:  http://blog.csdn.net/acdreamers/article/details/38929067

伯努利数的2个重要的式子:

为什么图片这么大。。。

这样的话n^2预处理出伯努利数,然后就可做了

 1 #include <bits/stdc++.h>
 2 #define LL long long
 3 using namespace std;
 4
 5 const int M=2005;
 6 const int maxn=2050;
 7 const int mod=1000000007;
 8
 9
10 int fac[maxn],inv[maxn],facinv[maxn];
11 void pre_C()
12 {
13     fac[0]=inv[1]=inv[0]=facinv[1]=facinv[0]=1;
14     for (int i=1; i<=M; i++) fac[i]=(LL)fac[i-1]*i%mod;
15     for (int i=2; i<=M; i++) inv[i]=(LL)(mod-mod/i)*inv[mod%i]%mod;
16     for (int i=2; i<=M; i++) facinv[i]=(LL)inv[i]*facinv[i-1]%mod;
17 }
18 LL C(int n, int m)
19 {
20     return (LL) fac[n]*facinv[m]%mod*facinv[n-m]%mod;
21 }
22
23 int B[maxn];
24 void pre_B()
25 {
26     B[0]=1;
27     for (int i=1; i<=M; i++)
28     {
29         int ans=0;
30         for (int j=0; j<i; j++) ans=(ans+(LL)C(i+1,j)*B[j]%mod)%mod;
31         ans=(LL)ans*(-inv[i+1])%mod;
32         ans=(ans+mod)%mod;
33         B[i]=ans;
34     }
35 }
36
37 int tmp[maxn];
38 int work(int k)
39 {
40     LL ans=inv[k+1],sum=0;
41     for (int i=1; i<=k+1; i++)
42         sum=(sum+C(k+1,i)*tmp[i]%mod*B[k+1-i]%mod)%mod;
43     ans=ans*sum%mod;
44     return ans%mod;
45 }
46
47 LL n;
48 int k;
49 int main()
50 {
51     pre_C(); pre_B();
52     int T; scanf("%d",&T);
53     while (T--)
54     {
55         scanf("%I64d %d",&n,&k);
56         n%=mod; tmp[0]=1;
57         for (int i=1; i<=M; i++) tmp[i]=(LL)tmp[i-1]*(n+1)%mod;
58         printf("%d\n",work(k));
59     }
60     return 0;
61 }
时间: 2024-12-19 14:42:56

51nod 1228 序列求和的相关文章

51nod 1258 序列求和 V4

跪烂(貌似我记得,是我要学习多项式的一些东西,然后发现可以搞伯努利数,然后就奇怪的入坑了) 这个题显然是不可以n^2来预处理伯努利数的 那怎么办呢........找题解啊... 这里有伯努利数的生成函数,(不知道怎么推的),然后搞一搞就成了一个多项式求逆的样子. 而且这个题还有一个BT的就是,1e9+7是不能写成1+2^k*n的形式的,所以就没有办法直接NTT,这里还要用到一个三模数NTT,就是取出3个满足1+2^k*n形式的大质数(先假设为a,b,c吧),满足a*b*c>n*P*P(P在这里就

51_1228 序列求和(伯努利数)(转)

转自:http://blog.csdn.net/acdreamers/article/details/38929067 (ACdreamers) 分析:本题题意就是求自然数的幂和,但是它的case比较多.对于求幂和本身就需要的时间复杂度,如果继 续用上述方法来求自然数的幂和,5000个case会TLE,接下来介绍另一个求自然数幂和的方法,它是基于伯 努利数的,公式描述如下 可以看出只要我们预处理出每一项,就可以在线性时间内求得自然数的幂和.前面的倒数可以用递推法求逆元 预处理,组合数也可以预处理

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

HDU 1588 Gauss Fibonacci(矩阵高速幂+二分等比序列求和) ACM 题目地址:HDU 1588 Gauss Fibonacci 题意: g(i)=k*i+b;i为变量. 给出k,b,n,M,问( f(g(0)) + f(g(1)) + ... + f(g(n)) ) % M的值. 分析: 把斐波那契的矩阵带进去,会发现这个是个等比序列. 推倒: S(g(i)) = F(b) + F(b+k) + F(b+2k) + .... + F(b+nk) // 设 A = {1,1,

51Nod 1228 -- 伯努利数

题目大意: 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 + 5^2 = 55. 由于结果很大,输出S(n) Mod 1000000007的结果即可. 其中1<=T<=5000,1<=n<=108,1<=k<=2000 可以用伯努利数求自然数k次幂和.公式: 其中B表示伯努利数. 那么我们可以预处理出B,C,然后就可以

【蓝桥杯】 入门训练 序列求和

入门训练 序列求和 时间限制:1.0s   内存限制:256.0MB 问题描述 求1+2+3+...+n的值. 输入格式 输入包括一个整数n. 输出格式 输出一行,包括一个整数,表示1+2+3+...+n的值. 样例输入 4 样例输出 10 样例输入 100 说明:有一些试题会给出多组样例输入输出以帮助你更好的做题. 一般在提交之前所有这些样例都需要测试通过才行,但这不代表这几组样例数据都正确了你的程序就是完全正确的,潜在的错误可能仍然导致你的得分较低. 样例输出 5050 数据规模与约定 1

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

HDU 1588 Gauss Fibonacci(矩阵快速幂+二分等比序列求和) ACM 题目地址:HDU 1588 Gauss Fibonacci 题意: g(i)=k*i+b;i为变量. 给出k,b,n,M,问( f(g(0)) + f(g(1)) + ... + f(g(n)) ) % M的值. 分析: 把斐波那契的矩阵带进去,会发现这个是个等比序列. 推倒: S(g(i)) = F(b) + F(b+k) + F(b+2k) + .... + F(b+nk) // 设 A = {1,1,

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

HDU 2254 奥运(矩阵快速幂+二分等比序列求和) ACM 题目地址:HDU 2254 奥运 题意: 中问题不解释. 分析: 根据floyd的算法,矩阵的k次方表示这个矩阵走了k步. 所以k天后就算矩阵的k次方. 这样就变成:初始矩阵的^[t1,t2]这个区间内的v[v1][v2]的和. 所以就是二分等比序列求和上场的时候了. 跟HDU 1588 Gauss Fibonacci的算法一样. 代码: /* * Author: illuz <iilluzen[at]gmail.com> * B

序列求和

入门训练 序列求和 时间限制:1.0s   内存限制:256.0MB 锦囊1 锦囊2 锦囊3 问题描述 求1+2+3+...+n的值. 输入格式 输入包括一个整数n. 输出格式 输出一行,包括一个整数,表示1+2+3+...+n的值. 样例输入 4 样例输出 10 样例输入 100 说明:有一些试题会给出多组样例输入输出以帮助你更好的做题. 一般在提交之前所有这些样例都需要测试通过才行,但这不代表这几组样例数据都正确了你的程序就是完全正确的,潜在的错误可能仍然导致你的得分较低. 样例输出 505

蓝桥杯-入门训练 序列求和

入门训练 序列求和 时间限制:1.0s   内存限制:256.0MB 问题描述 求1+2+3+...+n的值. 输入格式 输入包括一个整数n. 输出格式 输出一行,包括一个整数,表示1+2+3+...+n的值. 样例输入 4 样例输出 10 样例输入 100 说明:有一些试题会给出多组样例输入输出以帮助你更好的做题. 一般在提交之前所有这些样例都需要测试通过才行,但这不代表这几组样例数据都正确了你的程序就是完全正确的,潜在的错误可能仍然导致你的得分较低. 样例输出 5050 数据规模与约定 1