题意

题目链接

Sol

把式子拆开,就是求这个东西

\[\sum_{i = 0} ^n \sum_{j = 1}^{a + id} \sum_{x =1}^j x^k \pmod P
\]

那么设\(f(x) = \sum_{i = 1}^n i^k\),这是个经典的\(k + 1\)多项式,直接差值

式子就可以化成

\[\sum_{i = 0} ^n \sum_{j = 1}^{a + id} f(j) \pmod P
\]

设\(g(x) = \sum_{i = 1}^n f(x)\)

对\(g\)差分之后实际上也就得到了\(f(x)\),根据多项式的定义,\(g(x)\)是个\(k+2\)次多项式。

同理我们要求的就是个\(k+3\)次多项式

直接暴力插值就行了

时间复杂度:\(O(Tk^3)\)

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 1234567891, MAXN = 127;
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int T, K, a, N, d, f[MAXN], g[MAXN], x[MAXN];
int add(int x, int y) {
if(x + y < 0) return x + y + mod;
return x + y >= mod ? x + y - mod : x + y;
}
int add2(int &x, int y) {
if(x + y < 0) x = (x + y + mod);
else x = (x + y >= mod ? x + y - mod : x + y);
}
int mul(int x, int y) {
return 1ll * x * y % mod;
}
int fp(int a, int p) {
int base = 1;
while(p) {
if(p & 1) base = mul(base, a);
a = mul(a, a); p >>= 1;
}
return base;
}
int Large(int *a, int k, int N) {
for(int i = 0; i <= k; i++) x[i] = i;
int ans = 0;
for(int i = 0; i <= k; i++) {
int up = a[i], down = 1;
for(int j = 0; j <= k; j++) {
if(i == j) continue;
up = mul(up, add(N, -x[j]));
down = mul(down, add(x[i], -x[j]));
}
add2(ans, mul(up, fp(down, mod - 2)));
}
return ans;
}
signed main() {
#ifndef ONLINE_JUDGE
//freopen("a.in", "r", stdin);freopen("a.out", "w", stdout);
#endif
T = read();
while(T--) {
K = read(), a = read(), N = read(), d = read();
memset(f, 0, sizeof(f)); memset(g, 0, sizeof(g));
/*
for(int i = 1; i <= K + 4; i++) f[i] = add(f[i - 1], fp(i, K));
for(int i = 1; i <= K + 4; i++) g[i] = add(g[i - 1], Large(f, K + 4, a + i * d));//ֱ直接这样写是错的
for(int i = 1; i <= K + 4; i++) f[i] = add(f[i - 1], Large(g, K + 4, i));
printf("%d\n", Large(g, K + 4, N));
*/
for(int i = 1; i <= K + 4; i++) f[i] = add(f[i - 1], fp(i, K));
for(int i = 1; i <= K + 4; i++) f[i] = add(f[i], f[i - 1]);
for(int i = 0; i <= K + 4; i++) g[i] = add(i > 0 ? g[i - 1] : 0, Large(f, K + 4, add(a, mul(i, d))));
printf("%lld\n", Large(g, K + 4, N));
}
return 0;
}
/*
5
123 123456789 456879 132
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
*/

BZOJ3453: tyvj 1858 XLkxc(拉格朗日插值)的更多相关文章

  1. BZOJ.3453.tyvj 1858 XLkxc(拉格朗日插值)

    BZOJ 题意即求\[\sum_{i=0}^n\sum_{j=1}^{a+id}\sum_{x=1}^jx^k\] 我们知道最后一个\(\sum\)是自然数幂和,设\(f(n)=\sum_{x=1}^ ...

  2. 【BZOJ】3453: tyvj 1858 XLkxc 拉格朗日插值(自然数幂和)

    [题意]给定k<=123,a,n,d<=10^9,求: $$f(n)=\sum_{i=0}^{n}\sum_{j=1}^{a+id}\sum_{x=1}^{j}x^k$$ [算法]拉格朗日 ...

  3. bzoj3453: tyvj 1858 XLkxc(拉格朗日插值)

    传送门 \(f(n)=\sum_{i=1}^ni^k\),这是自然数幂次和,是一个以\(n\)为自变量的\(k+1\)次多项式 \(g(n)=\sum_{i=1}^nf(i)\),因为这东西差分之后是 ...

  4. [BZOJ3453]tyvj 1858 XLkxc:拉格朗日插值

    分析 之前一直不知道拉格朗日插值是干什么用的,只会做模板题,做了这道题才明白这个神奇算法的用法. 由题意可知,\(f(x)\)是关于\(x\)的\(k+1\)次函数,\(g(x)\)是关于\(x\)的 ...

  5. BZOJ 3453 - tyvj 1858 XLkxc(插值+推式子)

    题面传送门 首先根据我们刚学插值时学的理论知识,\(f(i)\) 是关于 \(i\) 的 \(k+1\) 次多项式.而 \(g(x)\) 是 \(f(x)\) 的前缀和,根据有限微积分那一套理论,\( ...

  6. 拉格朗日插值&&快速插值

    拉格朗日插值 插值真惨 众所周知$k+1$个点可以确定一个$k$次多项式,那么插值就是通过点值还原多项式的过程. 设给出的$k+1$个点分别是$(x_0,y_0),(x_1,y_1),...,(x_k ...

  7. Educational Codeforces Round 7 F - The Sum of the k-th Powers 拉格朗日插值

    The Sum of the k-th Powers There are well-known formulas: , , . Also mathematicians found similar fo ...

  8. 常系数齐次线性递推 & 拉格朗日插值

    常系数齐次线性递推 具体记在笔记本上了,以后可能补照片,这里稍微写一下,主要贴代码. 概述 形式: \[ h_n = a_1 h_{n-1}+a_2h_{n-2}+...+a_kh_{n-k} \] ...

  9. 快速排序 and 拉格朗日插值查找

    private static void QuictSort(int[] zu, int left, int right) { if (left < right) { ; ; ]; while ( ...

随机推荐

  1. JDK设计模式之—单例模式和static关键字

    首先了解static 关键字 static声明的方法是静态方法,static声明的成员变量为静态成员变量.对于该类的所有对象来说,static的成员变量和static只有一份存储空间 即使没有创建该类 ...

  2. editormd实现文章详情页面预览

    继之前博客写了editmd.js(国内开源的一款前端Markdown框架)实现的写文章功能之后,本博客介绍使用editormd实现文章预览功能,之前博客链接:https://blog.csdn.net ...

  3. ffmpeg常用转换命令

    音频转换: 1.转换amr到mp3: ffmpeg -i shenhuxi.amr amr2mp3.mp3 2.转换amr到wav: ffmpeg -acodec libamr_nb -i shenh ...

  4. 机器学习入门11 - 逻辑回归 (Logistic Regression)

    原文链接:https://developers.google.com/machine-learning/crash-course/logistic-regression/ 逻辑回归会生成一个介于 0 ...

  5. Python 高度定制化自己的线程类和进程类代码,获取启动进程或线程方法的结果(兼容Py2和Py3)

    #encoding=utf-8 from threading import Thread from multiprocessing import Process import multiprocess ...

  6. 动态dp初探

    动态dp初探 动态区间最大子段和问题 给出长度为\(n\)的序列和\(m\)次操作,每次修改一个元素的值或查询区间的最大字段和(SP1714 GSS3). 设\(f[i]\)为以下标\(i\)结尾的最 ...

  7. 冒泡 MS Azure 不便宜。。。

    一直在等 MS Azure 中国开卖, 最近有消息说正式商用了... 看看去,ok 发现官方网站 很奇葩.没有购买的地方 说毛线 啊 卧槽 欺骗感情还是吊人胃口? 好看了一下VM的价格,卧槽真不便宜. ...

  8. 《用Python解决数据结构与算法问题》在线阅读

    源于经典 数据结构作为计算机从业人员的必备基础,Java, c 之类的语言有很多这方面的书籍,Python 相对较少, 其中比较著名的一本 problem-solving-with-algorithm ...

  9. C++版 - 剑指offer 面试题31:连续子数组的最大和 题解

    剑指offer:连续子数组的最大和 提交网址: http://www.nowcoder.com/practice/459bd355da1549fa8a49e350bf3df484?tpId=13&am ...

  10. Oracle 理论到实践之碎碎念

    有关 Oracle 的著名谣传 1.如果你想把表中数据复制到另一张表,或者想根据现有表创建一个类似的新表,网上有大量不明所以的帖子告诉你实现该功能的语法是select field1,field2 in ...