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, ...
随机推荐
- Nginx 服务器的安装部署(CentOS系统)
1.准备安装环境yum -y install gcc gcc-c++ automake pcre pcre-devel zlib zlib-devel open openssl-develgcc编译器 ...
- 2017-2018-2 20155315《网络对抗技术》Exp7 :网络欺诈防范
实验目的 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 实验内容 简单应用SET工具建立冒名网站 ettercap DNS spoof 结合应用两种技术,用DNS sp ...
- Caffe 深度学习框架上手教程
Caffe 深度学习框架上手教程 blink 15年1月 Caffe (CNN, deep learning) 介绍 Caffe -----------Convolution Architec ...
- Neo4j 第四篇:使用C#更新和查询Neo4j
本文使用的IDE是Visual Studio 2015 ,驱动程序是Neo4j官方的最新版本:Neo4j Driver 1.3.0 ,创建的类库工程(Project)要求安装 .NET Framewo ...
- Markdown之语法入门篇
Markdown语法入门 一.什么是Markdown语言 我相信有很多小伙伴没有听说过Markdown语言.的确,对于一般人来说,有word足够了.但是有这么一群人,受够了word那糟糕的排版方式,需 ...
- 爱普生L313彩色打印相片
操作环境: windows 和MAC 一.普通打印(默认选项) 1.爱普生L313 普通默认打印为快速不清晰打印. 2.以上打印效果出来图片比较快速出图,但是清晰度不够 二.照片打印设置 1.照片设置 ...
- yocto-sumo源码解析(四):bitbake
1. 环境准备 按照前面几节的分享,我们已经知道了oe-init-build-env是如何建立yocto项目环境的,下面我们继续研究bitbake脚本,在这之前,因为我们选择qemuarm64为目标机 ...
- openstack删除僵尸卷
问题描述: 最近在清理openstack环境,在删除cinder云硬盘时,一直发现有两个卷在删除中. 解决方法如下: 首先我们去cinder的数据库中找到这个卷,命令为: MariaDB [(none ...
- 基于spring框架的apache shiro简单集成
关于项目的安全保护,我一直想找一个简单配置就能达到目的的方法,自从接触了shiro,这个目标总算达成了,以下结合我使用shiro的经验,谈谈比较轻便地集成该功能. 首先我们先了解一下shiro是什么. ...
- C++ 派生类构造函数和析构函数
几个问题 一个类的各数据成员的构造顺序? 按他们在类定义中出现的先后顺序:先定义者先构造. 类的对象成员的构造函数与类自身的构造函数的执行顺序? 先执行对象成员的构造函数,再执行类自身的构造函数. 构 ...