题解

我是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的每个点值

代码

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <ctime>
  7. #include <vector>
  8. #include <set>
  9. //#define ivorysi
  10. #define eps 1e-8
  11. #define mo 974711
  12. #define pb push_back
  13. #define mp make_pair
  14. #define pii pair<int,int>
  15. #define fi first
  16. #define se second
  17. #define MAXN 200005
  18. #define space putchar(' ')
  19. #define enter putchar('\n')
  20. using namespace std;
  21. typedef long long int64;
  22. typedef unsigned int u32;
  23. typedef unsigned long long u64;
  24. typedef double db;
  25. template<class T>
  26. void read(T &res) {
  27. res = 0;char c = getchar();T f = 1;
  28. while(c < '0' || c > '9') {
  29. if(c == '-') f = -1;
  30. c = getchar();
  31. }
  32. while(c >= '0' && c <= '9') {
  33. res = res * 10 + c - '0';
  34. c = getchar();
  35. }
  36. res *= f;
  37. }
  38. template<class T>
  39. void out(T x) {
  40. if(x < 0) putchar('-');
  41. if(x >= 10) {
  42. out(x / 10);
  43. }
  44. putchar('0' + x % 10);
  45. }
  46. const int64 MOD = 985661441;
  47. int64 fpow(int64 x,int64 c) {
  48. int64 res = 1,t = x;
  49. while(c) {
  50. if(c & 1) res = res * t % MOD;
  51. t = t * t % MOD;
  52. c >>= 1;
  53. }
  54. return res;
  55. }
  56. int T,K;
  57. int prime[MAXN],tot;
  58. int64 N,R,F[MAXN];
  59. int64 a[MAXN],b[MAXN];
  60. int64 MK[MAXN];
  61. int64 fac[MAXN],invfac[MAXN],Le[MAXN],Ri[MAXN];
  62. bool nonprime[MAXN];
  63. int64 C(int n,int m) {
  64. if(n < m) return 0;
  65. return fac[n] * invfac[n - m] % MOD * invfac[m] % MOD;
  66. }
  67. void Solve() {
  68. read(K);read(N);read(R);
  69. R %= MOD;
  70. if(R == 0) {puts("0");return;}
  71. MK[1] = 1;
  72. memset(nonprime,0,sizeof(nonprime));
  73. tot = 0;
  74. for(int i = 2 ; i <= K + 2 ; ++i) {
  75. if(!nonprime[i]) {
  76. prime[++tot] = i;
  77. MK[i] = fpow(i,K);
  78. }
  79. for(int j = 1 ; j <= tot ; ++j) {
  80. if(prime[j] > (K + 2) / i) break;
  81. nonprime[i * prime[j]] = 1;
  82. MK[i * prime[j]] = MK[i] * MK[prime[j]] % MOD;
  83. if(i % prime[j] == 0) break;
  84. }
  85. }
  86. if(R == 1) {
  87. F[0] = 0;
  88. for(int i = 1 ; i <= K + 2 ; ++i) F[i] = (F[i - 1] + MK[i]) % MOD;
  89. if(N <= K + 2) {out(F[N]);enter;return;}
  90. int64 t = 1,ans = 0;
  91. Le[0] = 1;
  92. N %= MOD;
  93. for(int i = 1 ; i <= K + 2 ; ++i) {
  94. Le[i] = Le[i - 1] * (N + MOD - i) % MOD;
  95. }
  96. Ri[K + 3] = 1;
  97. for(int i = K + 2 ; i >= 1 ; --i) {
  98. Ri[i] = Ri[i + 1] * (N + MOD - i) % MOD;
  99. }
  100. for(int i = K + 2 ; i >= 1 ; --i) {
  101. ans += t * invfac[i - 1] % MOD * invfac[K + 2 - i] % MOD * Le[i - 1] % MOD * Ri[i + 1] % MOD * F[i] % MOD;
  102. t = t * (MOD - 1) % MOD;
  103. }
  104. ans %= MOD;
  105. out(ans);enter;return;
  106. }
  107. a[0] = 1,b[0] = 0;
  108. int64 InvR = fpow(R,MOD - 2);
  109. for(int i = 1 ; i <= K + 1; ++i) {
  110. a[i] = 1LL * a[i - 1] * InvR % MOD;
  111. b[i] = (1LL * b[i - 1] * InvR + MK[i]) % MOD;
  112. }
  113. int64 suma = 0,sumb = 0,t = 1;
  114. if(K & 1) t = MOD - 1;
  115. for(int i = 0 ; i <= K + 1; ++i) {
  116. int64 h = t * C(K + 1,i) % MOD;
  117. suma = (suma + a[i] * h) % MOD;
  118. sumb = (sumb + b[i] * h) % MOD;
  119. t = t * (MOD - 1) % MOD;
  120. }
  121. F[0] = (MOD - sumb) * fpow(suma,MOD - 2) % MOD;
  122. for(int i = 1 ; i <= K + 1; ++i) F[i] = (a[i] * F[0] + b[i]) % MOD;
  123. int64 ans = 0;
  124. t = 1;
  125. if(N <= K) {
  126. ans = (fpow(R,N) * F[N] - F[0] + MOD) % MOD;
  127. out(ans);enter;
  128. return ;
  129. }
  130. int64 T = N % (MOD - 1);
  131. N %= MOD;
  132. Le[0] = N;
  133. for(int i = 1 ; i <= K ; ++i) {
  134. Le[i] = Le[i - 1] * (N + MOD - i) % MOD;
  135. }
  136. Ri[K + 1] = 1;
  137. for(int i = K ; i >= 0 ; --i) {
  138. Ri[i] = Ri[i + 1] * (N + MOD - i) % MOD;
  139. }
  140. if(K & 1) t = MOD - 1;
  141. for(int i = 0 ; i <= K; ++i) {
  142. int64 h;
  143. if(i == 0) h = t * invfac[i] % MOD * invfac[K - i] % MOD * Ri[i + 1] % MOD * F[i] % MOD;
  144. else h = t * invfac[i] % MOD * invfac[K - i] % MOD * Le[i - 1] % MOD * Ri[i + 1] % MOD * F[i] % MOD;
  145. t = t * (MOD - 1) % MOD;
  146. ans += h;
  147. }
  148. ans %= MOD;
  149. ans = (ans * fpow(R,T) - F[0] + MOD) % MOD;
  150. out(ans);enter;
  151. }
  152. int main() {
  153. #ifdef ivorysi
  154. freopen("f1.in","r",stdin);
  155. #endif
  156. fac[0] = 1;
  157. for(int i = 1 ; i <= 200001 ; ++i) fac[i] = fac[i - 1] * i % MOD;
  158. invfac[200001] = fpow(fac[200001],MOD - 2);
  159. for(int i = 200000 ; i >= 0 ; --i) invfac[i] = invfac[i + 1] * (i + 1) % MOD;
  160. read(T);
  161. while(T--) {
  162. Solve();
  163. }
  164. return 0;
  165. }

【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. "\n" 与"\r" 区别

    关于换行和回车其实平时我们不太在意,所以关于两者的区别也不太清楚,在平时开发时可能会遇到一些文件处理的问题,放到不同的操作系统上出现各种坑.那么回车和换行到底有哪些区别呢?今天咱们就来总结一下. 1. ...

  2. webapi框架搭建-安全机制(一)

    本系列博客链接:webapi框架搭建系列博客 前言 webapi接口是开放给外部使用的,包括接口的地址,传参的规范,还有返回结果的说明.正因为接口的开放性,使得接口的安全很重要.试想一下,用抓包工具( ...

  3. CF&&CC百套计划1 Codeforces Round #449 B. Ithea Plays With Chtholly

    http://codeforces.com/contest/896/problem/B 题意: 交互题 n张卡片填m个1到c之间的数,1<=n*ceil(c/2)<=m 最后填出一个单调非 ...

  4. Minicap使用分析

    想起前段时间研究过的minicap,抱着无果的心情再次看了源码,这次竟然比上次清晰了一点点,难道是因为这两天被android源码折磨得身心疲惫然而却在不知不觉中增长了?不懂怎么样,看懂了大概. Min ...

  5. jQuery技巧笔记

    1.关于页面元素的引用 通过jquery的$()引用元素包括通过id.class.元素名以及元素的层级关系及dom或者xpath条件等方法,且返回的对象为jquery对象(集合对象),不能直接调用do ...

  6. Request爬取网站(seo.chinaz.com)百度权重的查询结果

    一:脚本需求 利用Python3查询网站权重并自动存储在本地数据库(Mysql数据库)中,同时导出一份网站权重查询结果的EXCEL表格 数据库类型:MySql 数据库表单名称:website_weig ...

  7. 【总结】前端框架:react还是vue?

    之前写了一篇前端框架的大汇总,主要介绍了当下主流的框架和其特性.最近除了bootstrap,就属react和vue最为热门,这篇就主要拿这两个框架来做一下详细对比. 究竟如何正确使用?作为小白的我们从 ...

  8. Dream------scala--函数定义、流程控制、异常处理

    Dream------scala--函数定义.流程控制.异常处理 一.函数的定义 1.新建工程

  9. 关于limit_req和limit_conn的区别

    1,首先,limit_req和limit_conn两个模块都是为了来限流的,但是两者不在一个层面,为了搞清楚这个,必须先要弄清楚request和connection的区别,因为在很多情况下,我们把他们 ...

  10. 被我误解的max_connect_errors【转】

    实为吾之愚见,望诸君酌之!闻过则喜,与君共勉 第一节  什么是max_connect_errors 一开始接触这个参数的时候,感觉他和max_connections的含义差不多,字面意思简单明了,这个 ...