首页 > 其他分享 >AzusidNya人傻常数大

AzusidNya人傻常数大

时间:2024-06-07 20:56:18浏览次数:9  
标签:frac 前缀 int 多项式 sum 常数 AzusidNya binom

AzusidNya 17分钟前:

多项式快速幂 \(n\log n\) 跑 \(1e5\) 跑了 \(4\) 秒,乐

  • 删除

P5488 差分与前缀和

给定一个长为 \(n\) 的序列 \(a\),求出其 \(k\) 阶差分或前缀和。
结果的每一项都需要对 \(1004535809\) 取模。

\(1 \le n \le 10^5\)
\(0 \le a_i \le 10^9\)
\(1\le k \le 10^{2333}, k \not \equiv 0 \pmod{1004535809}\)

看过《具体数学》的话,很容易看出前缀和就是其生成函数卷积上 \((1 - x) ^ {-1}\),差分就是卷上 \((1 - x)\)。

当然这里也推一下吧。

\[\sum_{i} \left(\sum _{j = 0} ^{i}a_j\right)x^i = \sum _i \sum _{u + v = i} a_ux^u \times x^v \]

定义 \(A = \sum _{i} a_ix^i\),\(B = \sum _i x^i\)。

\[\sum _i \sum _{u + v = i} a_ux^u \times x^v = A * B \]

\[\sum _i x^i = (1 - x) ^{-1} \]

所以很进行一次前缀和就是卷上 \((1 - x) ^ {-1}\),而差分和前缀和是逆运算,所以只用卷上 \((1 - x)\)​ 就行了。

\(n\) 次前缀和就是卷上 \((1 - x) ^ {-k}\),差分就是卷上 \((1 - x)^k\)​

之前做过多项式快速幂,知道这里这么大的 \(k\) 是可以直接对模数取模的。

多项式快速幂和多项式求逆拍上去,做完了(误

好吧 AzusidNya 推到这一步这么做了,然后就有了上面第一句话。

虽然时间复杂度是 \(O(n \log n)\)​ 的,但是常数巨大。考虑优化,能卡常过去的可以无视下面的内容。

我们感觉 \((1 - x)^k\) 是很好看的,考虑不快速幂求出这个多项式的系数。

通过二项式定理把它展开,得到:

\[(1 - x) ^k = \sum _i (-1) ^i \binom ki x^i \]

这个式子可以递推求出来。

具体来说:

\[\binom ki = \frac {k!}{i!(k - i)!} = \frac {k - i + 1}{i} \frac {k!}{(i - 1)!(k - i + 1)!} = \frac {k - i + 1}{i}\binom{k}{i - 1} \]

然后我们可以把系数搞出来。

接下来求前缀和完全可以套一个多项式求逆。这样已经不会 TLE 了。

但是其实前缀和也能一样地用递推求出所有系数。

找回上面的式子:

\[(1 - x) ^k = \sum _i (-1) ^i \binom ki x^i \]

这里用下降幂表示二项式系数:

\[\binom ki = \frac{k^{\underline i}}{i!} \]

把 \(-k\) 代进去。

\[\begin {aligned} (1 - x) ^ {-k} &= \sum _i (-1) ^i \binom {-k}i x^i \\ &= \sum _i (-1) ^i \frac {(-k) ^ {\underline i}}{i!} x^i \\ &= \sum _i (-1) ^ {2i} \frac {k + i - 1 ^ {\underline i}}{i!} x^i \\ &= \sum_i \binom {k + i - 1}{i} x^i \end {aligned} \]

这玩意也是可以递推的,和上面的推导方法差不多,这里懒得再推一遍了。

这两个多项式的系数递推完后直接卷积就行了,问题变成了 【模板】多项式乘法。

代码删除了 namespace Poly 部分,因为 \(1000\) 个人有 \(1000\) 个多项式板子。

#include<iostream>
#include<fstream>
#include<algorithm>
#include<vector>
#include<string>
#define int long long
using namespace std;

namespace azus{
	using namespace Poly;
	int n, opt;
	int k;
	string sk;
	poly a;
	int main(){
		cin >> n >> sk >> opt;
		for(int i = 0; i < sk.size(); i ++){
			k = 1ll * k * 10 % P;
			k += sk[i] - '0';
			k %= P;
		}
//		cout << k << "\n";
		for(int i = 0, x; i < n; i ++){
			cin >> x;
			a.push_back(x);
		}
		poly d;
		d.resize(n);
		d[0] = 1;
		if(opt == 0)
		for(int i = 1; i < n; i ++)
			d[i] = (d[i - 1] * ((P + k + i - 1) % P) % P) * Ksm(i, P - 2) % P;
		else{
			for(int i = 1; i < n; i ++)
				d[i] = ((P - d[i - 1]) * ((P + k - i + 1) % P) % P) * Ksm(i, P - 2) % P;
		}
//		polyOutput(d);
		a = convolution(a, d);
		a.resize(n);
		polyOutput(a);
		return 0;
	}
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	int T = 1;
	while(T --) azus::main();
	return 0;
}

标签:frac,前缀,int,多项式,sum,常数,AzusidNya,binom
From: https://www.cnblogs.com/AzusidNya/p/18237840

相关文章

  • 第 1 节 常数项级数的概念和性质
    第一节常数项级数的概念和性质一、常数项级数的概念二、收敛级数的基本性质三、柯西审敛原理......
  • 第 2 节 常数项级数的审敛法
    第二节常数项级数的审敛法一、正项级数及其审敛法正项级数:各项都是正数或零的级数二、交错级数及其审敛法......
  • NASA数据集——2014 年、2015 年和 2017 年北美地区土壤地球物理属性值(源层厚度 (ALT)
    ABoVE:AirSWOTColor-InfraredImageryOverAlaskaandCanada,2017简介文件修订日期:2019-04-25数据集版本:1摘要本数据集提供了根据2014年、2015年和2017年8月和10月在阿拉斯加北部12个研究地点(除个别地点外)采集的机载次冠层和次表层微波观测站(AirMOSS)P......
  • 断电引起文件scn异常数据库恢复---惜分飞
    联系:手机/微信(+8617813235971)QQ(107644445)标题:断电引起文件scn异常数据库恢复作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]由于异常断电,数据库最初启动报错FriMar0108:41:172024ALTERDATABASE  MOUNTSucces......
  • 常数,玄学
    这是AC代码:#include<bits/stdc++.h>#definelllonglong#definemxn5003#definemd1000000007#definepbpush_back#definemkpmake_pair#defineldlongdouble#defineumapunordered_map#definerep(i,a,b)for(inti=a;i<=b;++i)#definerept(i,a,b......
  • 如果在循环中不改变vector的大小,C++编译器是否会将.size()优化为常数?
      在C++中,可以使用以下代码计算vector<int>中所有元素的和:vector<int>v={1,3,7,9};sums=0;for(inti=0;i<v.size();i++){sums+=v[i];}  这是一段很普通的代码,问题在于:在这段代码中,v.size()会在循环开始前仅计算一次?还是会在每次循环中都计算一次......
  • Jmeter 之常数吞吐量作用
    一  添加方法:线程组右键->添加->定时器->常数吞吐量定时器二作用:常数吞吐量定时器的作用:设置最大的吞吐量不超过设置的值注意:如果线程能发送的请求远远低于设置的最大值,那么这个最大值不会发挥作用 三基于计算吞吐量:是指控制吞吐量的对象,主要使用3类:......
  • 正常数组转换为树状结构
    1、这里子元素的标识是menuId,父id是parentId//转化后的树形结构数据getTree(menuList){letmenus=[];letsourceMap={};menuList.forEach(item=>{item.children=[];......
  • 一阶微分方程的常数变易法/洛谷P6613
    一阶微分方程的常数变易法(1)一阶齐次线性微分方程\[\begin{aligned}F'(x)&=P(x)F(x)\\\dfrac{1}{F(x)}\timesF'(x)&=P(x)\\(\lnF(x))'&=P(x)\\\lnF(x)&=\intP(x)\textdx+\lnC\\F(x)&=Ce^{\intP(x)\textdx}\\\end{ali......
  • 时间复杂度(常数循环、strchr、冒泡排序、二分查找)
    1.1常数循环//计算复杂度voidFunc4(intk){intcount=0;for(intk=0;k<100;++k){++count;}printf("%d\n",count);}时间复杂度为:O(1)  注:O(1)不是代表算法只能运行一次,是常数次1.2strchr的时间复杂度//计算strchar的时间复杂度constchar*strchr(constc......