51nod1229 序列求和 V2 【数学】
题目链接
题解
我们要求
\]
如果\(r = 1\),就是自然数幂求和,上伯努利数即可\(O(k^2)\)
否则,我们需要将式子进行变形
要与\(n\)无关
设
\]
自然数幂应该是不用去动了,两边乘个\(r\)
\]
相减得
(r - 1)F(k) &= r^{n + 1}n^{k} - r + \sum\limits_{i = 2}^{n}r^{i}((i - 1)^{k} - i^{k}) \\
&= r^{n + 1}n^{k} - r + \sum\limits_{i = 2}^{n}r^{i}(\sum\limits_{j = 0}^{k}{k \choose j}(-1)^{k - j}i^{j} - i^{k}) \\
&= r^{n + 1}n^{k} - r + \sum\limits_{i = 2}^{n}r^{i}\sum\limits_{j = 0}^{k - 1}{k \choose j}(-1)^{k - j}i^{j} \\
&= r^{n + 1}n^{k} - r + \sum\limits_{i = 2}^{n}\sum\limits_{j = 0}^{k - 1}{k \choose j}(-1)^{k - j}i^{j}r^{i} \\
&= r^{n + 1}n^{k} - r + \sum\limits_{j = 0}^{k - 1}{k \choose j}(-1)^{k - j}\sum\limits_{i = 2}^{n}i^{j}r^{i} \\
&= r^{n + 1}n^{k} - r + \sum\limits_{j = 0}^{k - 1}{k \choose j}(-1)^{k - j}(F(j) - r) \\
\end{aligned}
\]
故
\]
边界
\]
同样可以实现\(O(k^2)\)递推
#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<cstdio>
#include<vector>
#include<queue>
#include<cmath>
#include<map>
#define LL long long int
#define REP(i,n) for (int i = 1; i <= (n); i++)
#define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
#define cls(s,v) memset(s,v,sizeof(s))
#define mp(a,b) make_pair<int,int>(a,b)
#define cp pair<int,int>
using namespace std;
const int maxn = 2010,maxm = 100005,INF = 0x3f3f3f3f;
inline LL read(){
LL out = 0,flag = 1; char c = getchar();
while (c < 48 || c > 57){if (c == '-') flag = 0; c = getchar();}
while (c >= 48 && c <= 57){out = (out << 1) + (out << 3) + c - 48; c = getchar();}
return flag ? out : -out;
}
const int P = 1000000007;
LL F[maxn],B[maxn],fac[maxn],inv[maxn],fv[maxn],N = 2005;
inline LL qpow(LL a,LL b){
LL re = 1; a %= P;
for (; b; b >>= 1,a = 1ll * a * a % P)
if (b & 1) re = 1ll * re * a % P;
return re;
}
inline LL C(LL n,LL m){
if (m > n) return 0;
return 1ll * fac[n] * fv[m] % P * fv[n - m] % P;
}
void init(){
fac[0] = fac[1] = fv[0] = fv[1] = inv[0] = inv[1] = 1;
for (int i = 2; i <= N; i++){
fac[i] = fac[i - 1] * i % P;
inv[i] = 1ll * (P - P / i) * inv[P % i] % P;
fv[i] = fv[i - 1] * inv[i] % P;
}
B[0] = 1;
for (int k = 1; k < N; k++){
for (int i = 0; i < k; i++)
B[k] = (B[k] + C(k + 1,i) * B[i] % P) % P;
B[k] = 1ll * (P - 1) * inv[k + 1] % P * B[k] % P;
}
}
LL n,K,r;
void work1(){
n %= P;
LL tmp = n,ans = 0;
for (int i = K; ~i; i--){
ans = (ans + C(K + 1,i) * B[i] % P * tmp % P) % P;
tmp = tmp * n % P;
}
ans = ans * inv[K + 1] % P;
printf("%lld\n",(ans + qpow(n,K)) % P);
}
void work2(){
r %= P;
LL tmp = qpow(r,n + 1),t,tt = 1,rv = qpow(r - 1,P - 2);
F[0] = 1ll * (qpow(r,n) + P - 1) % P * rv % P * r % P;
for (int k = 1; k <= K; k++){
t = 0; tt = 1ll * tt * (n % P) % P;
for (int j = 0; j < k; j++)
t = (t + (((k - j) & 1) ? -1ll : 1ll) * C(k,j) * ((F[j] - r) % P) % P) % P;
t = (t + P) % P;
F[k] = ((tmp * tt % P - r) % P + t) % P * rv % P;
}
printf("%lld\n",(F[K] + P) % P);
}
int main(){
init();
int T = read();
while (T--){
n = read(); K = read(); r = read();
if (r == 1) work1();
else work2();
}
return 0;
}
51nod1229 序列求和 V2 【数学】的更多相关文章
- 51nod1229 序列求和 V2
这题...毒瘤吧,可能要写两份代码... 传送门 noteskey 我们考虑这里的复杂度肯定是与 k 相关的,而且平方也是没问题的,那么我们先看看 S(k) 能怎么得到: \[\begin{align ...
- [51nod]1229 序列求和 V2(数学+拉格朗日差值)
题面 传送门 题解 这种颓柿子的题我可能死活做不出来-- 首先\(r=0\)--算了不说了,\(r=1\)就是个裸的自然数幂次和直接爱怎么搞怎么搞了,所以以下都假设\(r>1\) 设 \[s_p ...
- 51nod1229-序列求和V2【数学,拉格朗日插值】
正题 题目链接:http://www.51nod.com/Challenge/Problem.html#problemId=1229 题目大意 给出\(n,k,r\)求 \[\sum_{i=1}^ni ...
- HDU 2254 奥运(矩阵高速幂+二分等比序列求和)
HDU 2254 奥运(矩阵高速幂+二分等比序列求和) ACM 题目地址:HDU 2254 奥运 题意: 中问题不解释. 分析: 依据floyd的算法,矩阵的k次方表示这个矩阵走了k步. 所以k ...
- HDU 5358 First One 求和(序列求和,优化)
题意:给定一个含n个元素的序列,求下式子的结果.S(i,j)表示为seq[i...j]之和.注:对于log20可视为1.数据量n<=105. 思路:即使能够在O(1)的时间内求得任意S,也是需要 ...
- 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 ...
- 51nod 1258 序列求和 V4
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1258 1258 序列求和 V4 基准时间限制:8 秒 空间限制:131 ...
- 【51Nod1258】序列求和V4(FFT)
[51Nod1258]序列求和V4(FFT) 题面 51Nod 多组数据,求: \[Ans=\sum_{i=1}^ni^k,n\le 10^{18},k\le50000\] 题解 预处理伯努利数,时间 ...
- 51nod_1236_序列求和 V3 _组合数学
51nod_1236_序列求和 V3 _组合数学 Fib(n)表示斐波那契数列的第n项,Fib(n) = Fib(n-1) + Fib(n-2).Fib(0) = 0, Fib(1) = 1. (1, ...
随机推荐
- [POI2007]旅游景点atr BZOJ1097
分析: 我们可以考虑,因为我们必须经过这些节点,那么我们可以将它状压,并且我们因为可以重复走,只是要求停顿前后,不要求遍历前后,那么我们之间存一下点与点之间的最短路,之后每次转移一下就可以了. f[i ...
- Android 下拉刷新上拉加载PullToRefresh
https://github.com/823546371/PullToRefresh http://www.jianshu.com/p/0f5d0991efdc
- 滚动条ScrollViewer防止滚动时按内容跳跃式滚动的设置
原文:滚动条ScrollViewer防止滚动时按内容跳跃式滚动的设置 属性中将CanContentScroll设置为False,滚动时就不会跳了,会连续的滚动
- POJ 1988&&2236
并查集,如果只是朴素的路径压缩,那么也就是一句话的事情. 但是,一般都没有这种仁慈的裸题(假的,多了去了) 1988:带权并查集,贼鸡儿像Luogu的那道杨威利的并查集(好像是叫银河英雄传说) 开两个 ...
- Ms.office2010安装教程
下面用到的软件下载地址如下:http://pan.baidu.com/s/1c08cxPI 第一步 1. 将压缩包office2010.rar解压解压后,会出现一个office2010文件夹如图1.1 ...
- 双面间谍(spy)
双面间谍 链接 分析: 戳这 代码: #include<cstdio> #include<algorithm> #include<cstdio> #include& ...
- 微信小程序之生命周期
1. 整个小程序生命周期 App({}) //app.js App({ onLaunch: function (options) { // 小程序初始化完成时(全局只触发一次) // 程序销毁(过一段 ...
- Django中的cookie和session
前言 HTTP协议 是短连接.且状态的,所以在客户端向服务端发起请求后,服务端在响应头 加入cokie响应给浏览器,以此记录客户端状态: cook是来自服务端,保存在浏览器的键值对,主要应用于用户登录 ...
- vue-router单页应用简单示例(三)
用vue-resource向服务器请求数据 我们主要来了解一下以下内容: 模拟服务端返回数据 用vue-resource向服务器请求数据 模拟服务器返回数据 我们用vue-cli创建的项目中,已经 ...
- [Direct2D开发] 绘制网格
转载请注明出处:http://www.cnblogs.com/Ray1024 一.引言 最近在使用Direct2D进行绘制工作中,需要实现使用Direct2D绘制网格的功能.在网上查了很多资料,终于实 ...