题解

我是zz吧

nonprime[i * prime[j]] = 0

= =

还以为是要卡常,卡了半天就是过不掉

我们来说这道题……

首先,我们考虑一个\(K^2\)做法

\(f_{k}(N) = \sum_{i = 1}^{N} i^{k}R^{i}\)

\((R - 1)f_{k}(N) = \sum_{i = 1}^{N}i^{k}R^{i + 1} - \sum_{i = 1}^{N} i^{k}R^{i}\)

\((R - 1)f_{k}(N) = N^{k}R^{N + 1} + \sum_{i = 1}^{N} [(i - 1)^{k} - i^{k}]R^{i}\)

\((R - 1)f_{k}(N) = N^{k}R^{N + 1} + \sum_{i = 1}^{N} [\sum_{j = 0}^{k}(-1)^{k - j}\binom{k}{j}i^{j} - i^{k}]R^{i}\)

\((R - 1)f_{k}(N) = N^{k}R^{N + 1} + \sum_{i = 1}^{N} \sum_{j = 0}^{k - 1}(-1)^{k - j}\binom{k}{j}i^{j}R^{i}\)

\((R - 1)f_{k}(N) = N^{k}R^{N + 1} + \sum_{j = 0}^{k - 1}(-1)^{k - j}\binom{k}{j}\sum_{i = 1}^{N} i^{j}R^{i}\)

\((R - 1)f_{k}(N) = N^{k}R^{N + 1} + \sum_{j = 0}^{k - 1}(-1)^{k - j}\binom{k}{j} f_{j}(N)\)

似乎。。。没法搞了

然而我们可以试试暴力展开一下

\(f_{0}(N) = \frac{R^{N + 1} - R}{R - 1} = R^{N + 1}\cdot (\frac{1}{R - 1}) - R\cdot (\frac{1}{R - 1})\)

$f_{1}(N) = \frac{N \cdot R^{N + 1}}{R - 1} - \frac{f_{0}(N)}{R - 1} = R^{N + 1}(\frac{N}{R - 1} - \frac{1}{(R - 1)^{2}}) - R\cdot (-\frac{1}{(R - 1)^2}) \(
\)f_{2}(N) = \frac{N{2}R{N + 1}}{R - 1} - \frac{2f_{1}(N)}{R - 1} + \frac{f_{0}(N)}{R - 1}= R^{N + 1}(\frac{N^{2}}{R - 1} - \frac{2N}{(R - 1)^{2}} + \frac{2}{(R - 1)^{3}} + \frac{1}{(R - 1)^{2}}) - R\cdot (\frac{1}{(R - 1)^2} + \frac{2}{(R - 1)^{3}}) $

我们可以猜测,并且归纳证明这个结论

\(f_{k}(N) = R^{N} F_{k}(N) - F_{k}(0)\)

其中\(F_{k}(N)\)是一个k次多项式

证明了多项式,那么就考虑插值

如何插值,我们发现按照定义有$F_{k}(N + 1)= \frac{F_{k}(N)}{R} + (N + 1)^{k} \(
我们设\)F_{k}(0) = x\(,然后用x表示剩下\)K + 1$个多项式

同时,我们尝试用插值法表示出\(F_{k}(K + 1)\)

式子经过整理后也就是

\(F_{k}(x) = \sum_{i = 0}^{k} (-1)^{k - i}\binom{x}{i}\binom{x - 1 - i}{k - i} F_{k}(i)\)

当\(x = K + 1\)时



\(F_{k}(k + 1) = \sum_{i = 0}^{k} (-1)^{k - i}\binom{x}{i}F_{k}(i)\)

也就是

\(\sum_{i = 0}^{k + 1} (-1)^{k - i}\binom{x}{i}F_{k}(i) = 0\)

代入即可解出\(F_{k}(0)\)从而求出F的每个点值

代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <ctime>
#include <vector>
#include <set>
//#define ivorysi
#define eps 1e-8
#define mo 974711
#define pb push_back
#define mp make_pair
#define pii pair<int,int>
#define fi first
#define se second
#define MAXN 200005
#define space putchar(' ')
#define enter putchar('\n')
using namespace std;
typedef long long int64;
typedef unsigned int u32;
typedef unsigned long long u64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) putchar('-');
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
const int64 MOD = 985661441;
int64 fpow(int64 x,int64 c) {
int64 res = 1,t = x;
while(c) {
if(c & 1) res = res * t % MOD;
t = t * t % MOD;
c >>= 1;
}
return res;
} int T,K;
int prime[MAXN],tot;
int64 N,R,F[MAXN];
int64 a[MAXN],b[MAXN];
int64 MK[MAXN];
int64 fac[MAXN],invfac[MAXN],Le[MAXN],Ri[MAXN];
bool nonprime[MAXN];
int64 C(int n,int m) {
if(n < m) return 0;
return fac[n] * invfac[n - m] % MOD * invfac[m] % MOD;
}
void Solve() {
read(K);read(N);read(R);
R %= MOD;
if(R == 0) {puts("0");return;}
MK[1] = 1;
memset(nonprime,0,sizeof(nonprime));
tot = 0;
for(int i = 2 ; i <= K + 2 ; ++i) {
if(!nonprime[i]) {
prime[++tot] = i;
MK[i] = fpow(i,K);
}
for(int j = 1 ; j <= tot ; ++j) {
if(prime[j] > (K + 2) / i) break;
nonprime[i * prime[j]] = 1;
MK[i * prime[j]] = MK[i] * MK[prime[j]] % MOD;
if(i % prime[j] == 0) break;
}
}
if(R == 1) {
F[0] = 0;
for(int i = 1 ; i <= K + 2 ; ++i) F[i] = (F[i - 1] + MK[i]) % MOD;
if(N <= K + 2) {out(F[N]);enter;return;}
int64 t = 1,ans = 0;
Le[0] = 1;
N %= MOD;
for(int i = 1 ; i <= K + 2 ; ++i) {
Le[i] = Le[i - 1] * (N + MOD - i) % MOD;
}
Ri[K + 3] = 1;
for(int i = K + 2 ; i >= 1 ; --i) {
Ri[i] = Ri[i + 1] * (N + MOD - i) % MOD;
}
for(int i = K + 2 ; i >= 1 ; --i) {
ans += t * invfac[i - 1] % MOD * invfac[K + 2 - i] % MOD * Le[i - 1] % MOD * Ri[i + 1] % MOD * F[i] % MOD;
t = t * (MOD - 1) % MOD;
}
ans %= MOD;
out(ans);enter;return;
}
a[0] = 1,b[0] = 0;
int64 InvR = fpow(R,MOD - 2);
for(int i = 1 ; i <= K + 1; ++i) {
a[i] = 1LL * a[i - 1] * InvR % MOD;
b[i] = (1LL * b[i - 1] * InvR + MK[i]) % MOD;
}
int64 suma = 0,sumb = 0,t = 1;
if(K & 1) t = MOD - 1;
for(int i = 0 ; i <= K + 1; ++i) {
int64 h = t * C(K + 1,i) % MOD;
suma = (suma + a[i] * h) % MOD;
sumb = (sumb + b[i] * h) % MOD;
t = t * (MOD - 1) % MOD;
}
F[0] = (MOD - sumb) * fpow(suma,MOD - 2) % MOD;
for(int i = 1 ; i <= K + 1; ++i) F[i] = (a[i] * F[0] + b[i]) % MOD;
int64 ans = 0;
t = 1;
if(N <= K) {
ans = (fpow(R,N) * F[N] - F[0] + MOD) % MOD;
out(ans);enter;
return ;
}
int64 T = N % (MOD - 1);
N %= MOD;
Le[0] = N;
for(int i = 1 ; i <= K ; ++i) {
Le[i] = Le[i - 1] * (N + MOD - i) % MOD;
}
Ri[K + 1] = 1;
for(int i = K ; i >= 0 ; --i) {
Ri[i] = Ri[i + 1] * (N + MOD - i) % MOD;
}
if(K & 1) t = MOD - 1;
for(int i = 0 ; i <= K; ++i) {
int64 h;
if(i == 0) h = t * invfac[i] % MOD * invfac[K - i] % MOD * Ri[i + 1] % MOD * F[i] % MOD;
else h = t * invfac[i] % MOD * invfac[K - i] % MOD * Le[i - 1] % MOD * Ri[i + 1] % MOD * F[i] % MOD;
t = t * (MOD - 1) % MOD;
ans += h;
}
ans %= MOD;
ans = (ans * fpow(R,T) - F[0] + MOD) % MOD;
out(ans);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
fac[0] = 1;
for(int i = 1 ; i <= 200001 ; ++i) fac[i] = fac[i - 1] * i % MOD;
invfac[200001] = fpow(fac[200001],MOD - 2);
for(int i = 200000 ; i >= 0 ; --i) invfac[i] = invfac[i + 1] * (i + 1) % MOD;
read(T);
while(T--) {
Solve();
}
return 0;
}

【51nod】1822 序列求和 V5的更多相关文章

  1. [51nod 1822]序列求和

    \(k\leq 200000\) 考虑转化成枚举 \(k\) 的形式 我们错位相减! \[A_k=\sum_{i=1}^N i^K\times R^i \\ RA_k=\sum_{i=2}^{N+1} ...

  2. 51nod 1258 序列求和 V4

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1258 1258 序列求和 V4  基准时间限制:8 秒 空间限制:131 ...

  3. 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 ...

  4. 51nod 1228 序列求和(伯努利数)

    1228 序列求和  题目来源: HackerRank 基准时间限制:3 秒 空间限制:131072 KB 分值: 160 难度:6级算法题  收藏  关注 T(n) = n^k,S(n) = T(1 ...

  5. 51nod 1228 序列求和 ( 1^k+2^k+3^k+...+n^k )

    C为组合数,B为伯努利数 具体推到过程略 参考博客:http://blog.csdn.net/acdreamers/article/details/38929067# (我的式子和博客中的不一样,不过 ...

  6. 51Nod - 1228 序列求和 (自然数幂和+伯努利数)

    https://vjudge.net/problem/51Nod-1228 Description T(n) = n^k,S(n) = T(1) + T(2) + ...... T(n).给出n和k, ...

  7. 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^ ...

  8. [51nod]1229 序列求和 V2(数学+拉格朗日差值)

    题面 传送门 题解 这种颓柿子的题我可能死活做不出来-- 首先\(r=0\)--算了不说了,\(r=1\)就是个裸的自然数幂次和直接爱怎么搞怎么搞了,所以以下都假设\(r>1\) 设 \[s_p ...

  9. 【51Nod1258】序列求和V4(FFT)

    [51Nod1258]序列求和V4(FFT) 题面 51Nod 多组数据,求: \[Ans=\sum_{i=1}^ni^k,n\le 10^{18},k\le50000\] 题解 预处理伯努利数,时间 ...

随机推荐

  1. Java基础-IO流对象之打印流(PrintStream与PrintWriter)

    Java基础-IO流对象之打印流(PrintStream与PrintWriter) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.打印流的特性 打印对象有两个,即字节打印流(P ...

  2. 怎么在.net里面解析JSON文件?

    我在网上搜了好多的文章,讲了很多的方法.但是无一例外的都看不懂...可能是因为我在这方面是个白痴吧... 所幸的是,我搜到了一个博客,写的很是清晰,比我之前看的大片文章写的好多了,在这里:http:/ ...

  3. python核心编程笔记——Chapter6

    Chapter 6.序列:字符串,列表和元组 这章内容比较多啊,看得比较久,而且题目又难很多. 6.1鉴定一个字符串是否是另外一个字符串的字串,这道题目不是很确定,好像没有直接的判定吧. 直接是否内建 ...

  4. 【我们开发有力量之二】利用javascript制作批量网络投票机器人(自动改IP)

    帮朋友忙网络投票,粗粗地看了下,投票没有什么限制,仅有一个ip校验:每天每个ip仅能投票一次. 也就是说,可以写一个程序,自动更换IP地址(伪造IP地址),实现批量刷票的目的.于是我写了一个投票机器人 ...

  5. C++模拟OC的多重自动释放池

    使用过OC的都知道,OC的引用计数机制用起来还比较方便.于是就仿照OC的形式搞了个C++引用计数. 支持多重自动释放池,每次autorelease都会放到栈顶的自动释放池中. 自动释放池也可以像变量一 ...

  6. Linux系统接入小区宽带

    jollywing(jollywing@foxmail.com) 安装 rp-pppoe 今天去联通营业厅开通了家庭宽带,回到家就搜索怎么用Linux接入小区宽带,发现大多数人都选择用PPPOE拨号上 ...

  7. shell开发规范

    版本1.0版,参考网上的一些文章规整而来.后期打算继续修改.完成一篇适合自己的shell开发规范. 最新编辑时间:2017.6.25 一. 命名规范 1. 版本和运行参数 1) 脚本开始之前以注释形式 ...

  8. [Ubuntu 14.04] 安装Flash && 安装QQ

    一.安装Flash 打开Firefox浏览器弹出的Flash安装提醒早都烦死了,那么Ubuntu14.04怎么安装Flash呢? 1.32位系统命令行安装: 第一步 更新库: sudo apt-get ...

  9. mysql 在windons下的备份命令

    1. @echo off set "Ymd=%date:~,4%%date:~5,2%%date:~8,2%" mysqldump -uroot -proot jy510 > ...

  10. docker 错误排查:无法进入容器.

    docker 错误排查:无法进入容器. #docker exec -it 3c1d bash rpc error: code = 2 desc = oci runtime error: exec fa ...