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, ...
随机推荐
- 20155308《网络攻防》 Exp1 PC平台逆向破解(5)M
20155308<网络攻防> Exp1 PC平台逆向破解(5)M 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是 ...
- WPF编程,窗口保持上次关闭时的大小与位置。
原文:WPF编程,窗口保持上次关闭时的大小与位置. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/details/8 ...
- Python 语言简介
Python是一种计算机程序设计语言.你可能已经听说过很多种流行的编程语言,比如非常难学的C语言,非常流行的Java语言,适合初学者的Basic语言,适合网页编程的JavaScript语言等等. 那P ...
- matplotlib 雷达图2
说明 搞了一个最新版本的雷达图,比以前那个美观. 不多说,代码奉上: 完整代码 ''' matplotlib雷达图 ''' import numpy as np import matplotlib.p ...
- PowerBI开发 第十三篇:增量刷新
PowerBI 将要解锁增量刷新(Incremental refresh)功能,这是一个令人期待的更新,使得PowerBI可以加载大数据集,并能减少数据的刷新时间和资源消耗,该功能目前处于预览状态,只 ...
- 【Orleans开胃菜系列1】不要被表象迷惑
[Orleans开胃菜系列1]不要被表象迷惑 /** * prism.js Github theme based on GitHub's theme. * @author Sam Clarke */ ...
- node基础-文件系统-文件写操作
文件操作频率最高的就是读跟写.nodejs的文件的读取API在<node基础-文件系统-读取文件>里已经简单介绍过,本文就简单介绍下nodejs的文件写API. nodejs的文件操作均提 ...
- 联想拯救者15-isk安装固态硬盘与系统迁移教程
一.固态选择 首先知道拯救者15-ISK是m.2接口2280尺寸,支持PCIE协议NVMe接口标准.我加装的固态是HP EX900系列250G M.2 NVMe固态硬盘. 二.开盖安装 1.拯救者15 ...
- QUIC和TCP
作者:henrystark henrystark@126.com Blog: http://henrystark.blog.chinaunix.net/ 日期:20140626 本文遵循CC协议:署名 ...
- underscore.js源码解析(一)
一直想针对一个框架的源码好好的学习一下编程思想和技巧,提高一下自己的水平,但是看过一些框架的源码,都感觉看的莫名其妙,看不太懂,最后找到这个underscore.js由于这个比较简短,一千多行,而且读 ...