题意

题目链接

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. Kali学习笔记34:配置TFTP和FTP服务

    配置TFTP: 默认情况下windowsXP和2003是开启TFTP服务的 其他windows到控制面板设置好就行 kali系统也是安装了TFTP服务的:atftpd 下面是一些配置并放入一个文件 w ...

  2. 哦,这就是java的优雅停机?(实现及原理)

    优雅停机? 这个名词我是服的,如果抛开专业不谈,多好的名词啊! 其实优雅停机,就是在要关闭服务之前,不是立马全部关停,而是做好一些善后操作,比如:关闭线程.释放连接资源等. 再比如,就是不会让调用方的 ...

  3. NumPy 学习笔记(二)

    数组索引: 1.ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样:   由于数组可能是多维的,所以必须为数组的每个维度指定一个切片,使用切片时返回 ...

  4. Linux 总是提示You have new mail in /var/spool/mail/root

    解决办法: echo “unset MAILCHECK” >> /etc/profile source /etc/profile 这样就可以了!!!!!!!!!!

  5. 在Java里>、>>、>>>的含义

    在java中: >表示大于,如:if(a>b)...结果是boolean类型 >>表示右移,如:int i=15; i>>2的结果是3,移出的部分将被抛弃. 转为二 ...

  6. 微信小程序内嵌网页的一些(最佳)实践

    前言 3 个月前,微信小程序推出了 web-view 组件引发了一波小高潮,笔者所在的大前端团队写过一篇浅析,详情可见:浅谈微信小程序前端生态. 我们曾大胆猜想,这一功能,可能直接导致小程序数量增长迎 ...

  7. 【design patterns】设计模式

    1.单例设计模式(singleton) 用途举例:对于多个程序使用同一个配置信息对象时比如在连接数据库时使用单例模式,每次只取出一个连接 步骤:①私有化该类的构造函数 ②私有化一个静态的对象 ③公有化 ...

  8. [Leetcode]895.最大频率栈

    Problem 实现 FreqStack,模拟类似栈的数据结构的操作的一个类. FreqStack 有两个函数: push(int x),将整数 x 推入栈中. pop(),它移除并返回栈中出现最频繁 ...

  9. Python快速学习08:模块的操作

    前言 系列文章:[传送门] 天气干燥,我就上火,流鼻血.希望身子好起来. 正文 函数和对象都是为了更好的组织已经有的程序,以方便重复利用. 模块(module)也是为了同样的目的.模块可以包含可执行代 ...

  10. Cannot retrieve metalink for repository: epel/x86_64. Please verify its path and try again 解决方法

    vim /etc/yum.repos.d/epel.repo 1 [epel] 2 name=Extra Packages for Enterprise Linux 7 - $basearch 3 # ...