某考试 T2 sum


为什么其他人都是插值套插值啊,,,,就我是XJB做的吗2333
k次多项式的前缀和可以表示成k+1次多项式,用两次这个玩意就可以发现g可以表示成一个k+2次多项式。
然后我的做法是把g用拉格朗日插值+暴力多项式乘法乘出来,通过其他方法合并g(a),g(a+d),,,,,g(a+nd)。
假设我们现在把g的多项式的每个指数的系数都求出来了,设x^i前的系数是b[i],
那么答案显然就是b[0] * a^0 + b[1] * a^1 + b[2] * a^2 +....b[k+2] * a^(k+2) + b[0] * (a+d)^0 + b[1] * (a+d)^1 + b[2] * (a+d)^2 +....b[k+2] * (a+d)^(k+2)+......
然后我们可以把次数一样的合并到一个类里,提一个b[]出来,里面的求和只需要把括号拆了之后推一推,然后你就会发现还需要 组合数 和自然幂数前缀和。
所以我们在之前预处理一下组合数 还有 1到n 的 1-k+2 次前缀和,就可以直接计算了。
不过这个算法的瓶颈不在这里,这些计算的复杂度只是O(K^2)的。
前面的暴力多项式乘法才是这个算法的瓶颈,是O(K^3)的,不过足够通过本题了2333 (反正好像直接插值套插值也要 O(N^3)吧)。
至于前面的拉格朗日插值部分我就不说了,反正就算我说了会的还是会不会的还是不会2333。
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define ll long long
using namespace std;
const int maxn=405;
const int ha=1234567891; inline ll add(ll x,ll y){
x+=y;
return x>=ha?x-ha:x;
} struct node{
ll tp,a[maxn]; inline void clear(){
tp=0;
memset(a,0,sizeof(a));
} node operator +(const node &u)const{
node r; r.clear();
r.tp=max(tp,u.tp);
for(int i=0;i<=r.tp;i++) r.a[i]=add(a[i],u.a[i]);
return r;
} node operator *(const node &u)const{
node r; r.clear();
r.tp=tp+u.tp;
for(int i=0;i<=tp;i++)
for(int j=0;j<=u.tp;j++) r.a[i+j]=add(r.a[i+j],a[i]*u.a[j]%ha);
return r;
} node operator *(const ll &u)const{
node r; r.clear();
r.tp=tp;
for(int i=0;i<=tp;i++) r.a[i]=a[i]*u%ha;
return r;
}
}qz[maxn],hz[maxn],ANS;
ll K,A,N,D,T,L,jc[maxn];
ll f[maxn],g[maxn],ni[maxn];
ll C[maxn][maxn],sum[maxn]; inline ll ksm(ll x,ll y){
ll an=1;
for(;y;y>>=1,x=x*x%ha) if(y&1) an=an*x%ha;
return an;
} inline void prework(){
L=K+3;
for(int i=0;i<=L+1;i++) qz[i].clear(),hz[i].clear();
ANS.clear();
} inline void init(){
C[0][0]=1;
for(int i=1;i<=400;i++){
C[i][0]=1;
for(int j=1;j<=i;j++) C[i][j]=add(C[i-1][j-1],C[i-1][j]);
}
jc[0]=1,ni[0]=1;
for(int i=1;i<=400;i++) jc[i]=jc[i-1]*(ll)i%ha,ni[i]=ksm(jc[i],ha-2);
} inline ll calc(ll tmp){
ll tot=0,INV=ksm(A,ha-2),base=ksm(A,tmp),d=1;
for(int i=0;i<=tmp;i++,base=base*INV%ha,d=d*D%ha){
tot=add(tot,sum[i]*C[tmp][i]%ha*base%ha*d%ha);
}
return tot;
} inline void solve(){
for(int i=1;i<=L;i++) f[i]=add(f[i-1],ksm(i,K));
for(int i=1;i<=L;i++) g[i]=add(g[i-1],f[i]);
//calc g
qz[0].a[0]=hz[L+1].a[0]=1;
for(int i=1;i<=L;i++){
qz[i].a[0]=ha-i,qz[i].a[1]=1,qz[i].tp=1;
hz[i]=qz[i];
}
for(int i=1;i<L;i++) qz[i]=qz[i-1]*qz[i];
for(int i=L;i>1;i--) hz[i]=hz[i+1]*hz[i]; for(int i=1;i<=L;i++) ANS=ANS+(qz[i-1]*hz[i+1])*(g[i]*ni[i-1]%ha*ni[L-i]%ha*(((L-i)&1)?ha-1:1)%ha);
//g is OK! ll ans=0; sum[0]=N+1;
for(int i=1;i<=ANS.tp;i++){
sum[i]=ksm(N+1,i+1);
for(int j=0;j<i;j++) sum[i]=add(sum[i],ha-C[i+1][i+1-j]*sum[j]%ha);
sum[i]=sum[i]*ksm(i+1,ha-2)%ha;
} for(int i=0;i<=ANS.tp;i++) ans=add(ans,ANS.a[i]*calc(i)%ha);
printf("%lld\n",ans);
} int main(){
// freopen("sum.in","r",stdin);
// freopen("sum.out","w",stdout); scanf("%lld",&T);
init();
while(T--){
scanf("%lld%lld%lld%lld",&K,&A,&N,&D);
prework();
solve();
}
return 0;
}
某考试 T2 sum的更多相关文章
- 9.13 考试 T2 区间
删区间 题意: 给出一个长度为
- 2019.2.10考试T2, 多项式求exp+生成函数
\(\color{#0066ff}{ 题目描述 }\) 为了减小文件大小,这里不写一堆题目背景了. 请写一个程序,输入一个数字N,输出N个点的森林的数量.点有标号. 森林是一种无向图,要求图中不能存在 ...
- 某考试T2 frog
题目背景 无 题目描述 数轴上有 n 只青蛙,分别编号为 1 到 n.青蛙 i 的初始位置的坐标为 xi. 它们准备进行如下形式的移动:每轮包括 m 次跳跃,第 i 次跳跃由青蛙 ai(1 < ...
- 某考试 T2 Tree
2 树 2.1 题目描述 给一棵n 个节点的树,节点分别编号为0 到n - 1.你可以通过如下的操作来修改这棵树:首先先删去树上的一条边,此时树会分裂为两个连通块,然后在两个连通块之间加上一条新的边使 ...
- 某考试 T2 yja
2.1 Description 在平面上找 n 个点, 要求这 n 个点离原点的距离分别为 r1, r2, ..., rn. 最大化这 n 个点构成的凸包面积, 凸包上的点的顺序任意. 2.2 Inp ...
- 题解 2020.10.24 考试 T2 选数
题目传送门 题目大意 见题面. 思路 本来以为zcx.pxj变强了,后来发现是SPJ出问题了...考试的时候感觉有点人均啊...结果自己还是只想出来一半. 我们假设 \(f(x)=(\lfloor\f ...
- 2019.3.7考试T2 离线数论??
$ \color{#0066ff}{ 题目描述 }$ 一天,olinr 在 luogu.org 刷题,一点提交,等了一分钟之后,又蛙又替. olinr 发动了他的绝招,说:"为啥啊???&q ...
- 某考试 T2 orzcyr
非常nice的一道行列式的题目. 考虑如果没有路径不相交这个限制的话,那么这个题就是一个行列式:设 a[i][j] 为从编号第i小的源点到编号第j小的汇点的路径条数,那么矩阵a[][]的行列式就是的答 ...
- 2019.2.26考试T2 矩阵快速幂加速DP
\(\color{#0066ff}{题解 }\) 可以发现, 数据范围中的n特别小,容易想到状压 可以想到类似于状压DP的思路,按列进行转移 那么应该有3维,\(f[i][j][k]\)代表到第i列, ...
随机推荐
- shell脚本,通过传参求斐波那契数列如(0,1,1,2,3,5,8,13..........)
[root@localhost wyb]# cat fibo.sh #!/bin/bash #斐波那契数列 ,,,,,,, > file >> file count=$ for i ...
- (63)zabbix low-level discover zabbix批量部署必备
1. 概述 <zabbix发现配置>server通过配置好的规则,自动添加host.group.template <zabbix Active agent自动注册>与disco ...
- Pycharm快捷键及Python常用转义符
不管是windows.xshell或者pycharm,学会使用快捷键都会使学习工作达到事半功倍的效果.这篇博客收集了部分常用的pycharm快捷键,分享给大家,希望对大家有用. 1. 常用快捷键 Py ...
- sweetalert使用随笔
删除前确认框: //找到删除那天记录的按钮,触发点击事件 $(".del").on('click', function () { swal({ title: "操作确认& ...
- DELL R730 服务器拷贝大文件
从服务器上拷贝大文件,通过USB拷贝,写入速度很慢,而且拷贝到100多G的时候直接卡死. 原因:服务器的USB是2.0,传输速率很慢. 解决方法: 找一台笔记本,USB 接口是3.0的,通过网络共享传 ...
- MySQL学习点滴
MySQL学习点滴 --分区表 概述: 分区功能并不是在存储引擎层完成的,因此很多存储引擎包括InnoDB, MyISAM, NDB等都支持分区功能.但也并不是所有的存储引擎都支持分区.在使用分区前, ...
- 折半查找,binarySearch
折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务.它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比 ...
- Oracle联合主键
转https://www.cnblogs.com/king-xg/p/6721272.html alter table tablename add constraint unionkeyname pr ...
- jmeter压力测试入门
http://www.51testing.com/html/80/n-853680.html http://blog.csdn.net/vincy_zhao/article/details/70238 ...
- x86 保护方式 简介 一
80386 三种工作方式 实模式 保护模式和虚拟86模式 只有在保护方式下 全部32条地址线才有效 可以寻址高达4g字节的物理地址空间 超过1m的内存空间 被成为扩展的内存空 ...