题目描述:求

\[\sum_{i=1}^ni^kr^i
\]

对某个质数取模。\(T\)组数据。

数据范围:\(n,r\le 10^{18},\sum k\le 2.56\times 10^6\)


数论神题。。。

我们设\(S_k(n)=\sum_{i=1}^{n-1}i^kr^i\),通过推通项公式,你会发现这个结论:

\[S_k(n)=r^nF_k(n)-F_k(0)
\]

其中\(F_k(n)\)是一个关于\(n\)且次数不高于\(k\)的多项式。

如何证明呢?首先你可以通过错位相减法得到一个递推公式,然后就可以数学归纳法了。

然后我们就是要求出\(F_k(0),F_k(1),F_k(2),\ldots,F_k(k+1)\),这样就可以通过拉格朗日插值求出\(F_k(n)\)。

我们注意到\(S_k(n)-S_k(n-1)=r^nF_k(n)-r^{n-1}F_k(n-1)=r^{n-1}(n-1)^k\),所以\(F_k(n)=\dfrac{F_k(n-1)+(n-1)^k}{r}\)。

然后我们知道,\(k\)次多项式的\(k+1\)阶差分为\(0\),即

\[\sum_{i=0}^{k+1}(-1)^i\binom{k+1}{i}F_k(k+1-i)=0
\]

于是可以设\(F_k(0)=x\),然后不停代入,然后用这个式子解方程。具体实现可以写一个二项式binom来做。

注意特判一些特殊情况。时间复杂度\(O(k)\)。

code
#include<bits/stdc++.h>
#define Rint register int
using namespace std;
typedef long long LL;
const int N = 1000012, mod = 1e9 + 7;
inline int kasumi(int a, int b){
int res = 1;
while(b){
if(b & 1) res = (LL) res * a % mod;
a = (LL) a * a % mod; b >>= 1;
}
return res;
}
inline void upd(int &a, int b){a += b; if(a >= mod) a -= mod;}
inline int add(int a, int b){return (a + b >= mod) ? (a + b - mod) : (a + b);}
inline int sub(int a, int b){return (a < b) ? (a + mod - b) : (a - b);}
int T, k, fac[N], inv[N];
LL n, r;
struct binom {
int a, b;
inline binom(int _a = 0, int _b = 0): a(_a), b(_b){}
inline binom operator + (const binom &o) const {return binom(add(a, o.a), add(b, o.b));}
inline binom operator - (const binom &o) const {return binom(sub(a, o.a), sub(b, o.b));}
inline binom operator * (int v) const {return binom((LL) a * v % mod, (LL) b * v % mod);}
} S[N];
inline int lagrange(int *A, int k, LL n){
static int pre[N], suf[N];
pre[0] = suf[k + 1] = 1;
for(Rint i = 1;i <= k;i ++) pre[i] = (n - i + 1) % mod * pre[i - 1] % mod;
for(Rint i = k;i;i --) suf[i] = (n - i) % mod * suf[i + 1] % mod;
int ans = 0;
for(Rint i = 0;i <= k;i ++){
int tmp = (LL) inv[i] * inv[k - i] % mod * pre[i] % mod * suf[i + 1] % mod;
if((k - i) & 1) tmp = mod - tmp;
upd(ans, (LL) A[i] * tmp % mod);
}
return ans;
}
int pri[N], tot, po[N], minp[N];
bool notp[N];
inline void init(int n){
notp[0] = notp[1] = 1;
for(Rint i = 2;i <= n;i ++){
if(!notp[i]) pri[++ tot] = i;
for(Rint j = 1;j <= tot && i * pri[j] <= n;j ++){
notp[i * pri[j]] = 1; minp[i * pri[j]] = pri[j];
if(!(i % pri[j])) break;
}
}
fac[0] = 1;
for(Rint i = 1;i <= n;i ++) fac[i] = (LL) fac[i - 1] * i % mod;
inv[n] = kasumi(fac[n], mod - 2);
for(Rint i = n;i;i --) inv[i - 1] = (LL) inv[i] * i % mod;
}
inline void calc(int k){
po[0] = 0; po[1] = 1;
for(Rint i = 2;i <= k + 1;i ++)
if(notp[i]) po[i] = (LL) po[minp[i]] * po[i / minp[i]] % mod;
else po[i] = kasumi(i, k);
}
inline int C(int n, int m){if(n < 0 || m < 0 || n < m) return 0; return (LL) fac[n] * inv[m] % mod * inv[n - m] % mod;}
inline int solve(LL n, int k, int r){
static int F[N];
int invr = kasumi(r, mod - 2);
if(!r) return 0;
memset(F, 0, (k + 2) << 2);
calc(k);
if(r == 1){
for(Rint i = 1;i <= k + 1;i ++) F[i] = add(F[i - 1], po[i]);
return n <= k + 1 ? F[n] : lagrange(F, k + 1, n);
}
if(!n) return 0;
if(!k) return (LL) sub(kasumi(r, n + 1), r) * kasumi(r - 1, mod - 2) % mod;
S[0] = binom(1, 0);
for(Rint i = 1;i <= k + 1;i ++)
S[i] = (S[i - 1] + binom(0, po[i - 1])) * invr;
binom qwq;
for(Rint i = 0;i <= k + 1;i ++)
if(i & 1) qwq = qwq + S[k + 1 - i] * C(k + 1, i);
else qwq = qwq - S[k + 1 - i] * C(k + 1, i);
F[0] = (LL) (mod - qwq.b) * kasumi(qwq.a, mod - 2) % mod;
for(Rint i = 1;i <= k + 1;i ++) F[i] = (LL) add(F[i - 1], po[i - 1]) * invr % mod;
int ans = lagrange(F, k + 1, n + 1);
return (LL) sub((LL) ans * kasumi(r, (n + 1) % (mod - 1)) % mod, F[0]);
}
int main(){
scanf("%d", &T); init(1000010);
while(T --){
scanf("%lld%lld%d", &n, &r, &k);
printf("%d\n", solve(n, k, r % mod));
}
}

SP19997 MOON2 - Moon Safari (Hard) 【数论,多项式】的更多相关文章

  1. python机器学习卷积神经网络(CNN)

    卷积神经网络(CNN) 关注公众号"轻松学编程"了解更多. 一.简介 ​ 卷积神经网络(Convolutional Neural Network,CNN)是一种前馈神经网络,它的人 ...

  2. 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/常用套路【入门】

    原文链接https://www.cnblogs.com/zhouzhendong/p/Fast-Fourier-Transform.html 多项式 之 快速傅里叶变换(FFT)/数论变换(NTT)/ ...

  3. Algorithm: 多项式乘法 Polynomial Multiplication: 快速傅里叶变换 FFT / 快速数论变换 NTT

    Intro: 本篇博客将会从朴素乘法讲起,经过分治乘法,到达FFT和NTT 旨在能够让读者(也让自己)充分理解其思想 模板题入口:洛谷 P3803 [模板]多项式乘法(FFT) 朴素乘法 约定:两个多 ...

  4. 数论 - Moon Game

    Fat brother and Maze are playing a kind of special (hentai) game in the clearly blue sky which we ca ...

  5. UOJ269【清华集训2016】如何优雅地求和【数论,多项式】

    题目描述:求 $$\sum_{k=0}^nf(k)\binom{n}{k}x^k(1-x)^{n-k}$$ 输入$n$,$f(x)$的次数上界$m$,$x$,$f(0,1,\ldots,m)$,对$9 ...

  6. 模板 - 数学 - 多项式 - 快速数论变换/NTT

    Huffman分治的NTT,常数一般.使用的时候把多项式的系数们放进vector里面,然后调用solve就可以得到它们的乘积.注意这里默认最大长度是1e6,可能需要改变. #include<bi ...

  7. 多项式乘法(FFT)模板 && 快速数论变换(NTT)

    具体步骤: 1.补0:在两个多项式最前面补0,得到两个 $2n$ 次多项式,设系数向量分别为 $v_1$ 和 $v_2$. 2.求值:用FFT计算 $f_1 = DFT(v_1)$ 和 $f_2=DF ...

  8. NOI 2019 省选模拟赛 T1【JZOJ6082】 染色问题(color) (多项式,数论优化)

    题面 一根长为 n 的无色纸条,每个位置依次编号为 1,2,3,-,n ,m 次操作,第 i 次操作把纸条的一段区间 [l,r] (l <= r , l,r ∈ {1,2,3,-,n})涂成颜色 ...

  9. JZYZOJ 2041 快速数论变换 NTT 多项式

    http://172.20.6.3/Problem_Show.asp?id=2041 https://blog.csdn.net/ggn_2015/article/details/68922404 代 ...

随机推荐

  1. spring Boot 学习(二、Spring Boot与缓存)

    一.概述1. 大多应用中,可通过消息服务中间件来提升系统异步通信.扩展解耦能力 2. 消息服务中两个重要概念: 消息代理(message broker)和目的地(destination) 当消息发送者 ...

  2. 两个div并排显示,当浏览器界面缩小时会出现换行

    解决:规定两个子div的父div的宽 <div id="showDataDiv" style="width: 1000px"> <div st ...

  3. MVC利用JQuery异步加载PartialView

    Javascript: $("#indexList").load('/Test/Index',{"id":"1","name&qu ...

  4. 转:更改pip源至国内镜像,显著提升下载速度

    经常在使用python的时候需要安装各种模块,而pip是很强大的模块安装工具,但是由于国外官方pypi经常被墙,导致不可用,所以我们最好是将自己使用的pip源更换一下,这样就能解决被墙导致的装不上库的 ...

  5. Java visualvm

    简介 VisualVM是一个集成多个JDK命令行工具的可视化工具.可以作为Java应用程序性能分析和运行监控的工具.开发人员可以利用它来监控.分 析线程信息,浏览内存堆数据.系统管理员可以利用它来监测 ...

  6. 处理vue-quill-editor回显数据的时候没有空格问题

    这是我要实现的效果 这是我回显后的情况(可以看见空格都没有了) 处理后 处理方法  添加一个class="ql-editor" <quill-editor class=&qu ...

  7. 全网最easy的better-scroll实现上拉加载和下拉刷新

    前言 移动端页面常见的一种效果:下拉刷新(pulldownrefresh)和上拉加载(pullupload),目的都是为了增强用户的体验效果,因此各种移动端滑动插件也是层出不穷,今天小编也在这里给大家 ...

  8. Web网站实现facebook登录

    一.登录facebook开发者中心:https://developers.facebook.com 二.创建应用编号,如下图: 三.添加产品选择Facebook登录,如下图: 四.facebbok登录 ...

  9. ABAP-表修改日志存储

    1.设置了变更文档的,可以通过查看标准表CDHDR,CDPOS SE38   --  RSUSR200   ST03N -- 专家模式 2.SE16N维护的数据,可以查看表SE16N_CD_KEY,S ...

  10. GitHub Java项目推荐|不需要 ROOT权限的类似按键精灵的自动操作

    不需要 ROOT 权限的类似按键精灵的自动操作软件,可以实现自动点击.滑动.输入文字.打开应用等.Auto.js 的大部分用户用它来点赞.签到.刷游戏 项目分析 仓库名称:Auto.js 标星(sta ...