首页 > 其他分享 >多项式全家桶

多项式全家桶

时间:2023-01-17 13:23:30浏览次数:30  
标签:ch const int 多项式 全家 long Pi getchar

\(FFT\)

快速傅里叶变换 卷积 模板

#include<bits/stdc++.h>
#include<complex>
using namespace std;

const int N=1e7+10;
const double Pi=acos(-1);

int read() {

	int x=0,f=1;
	char ch=getchar();
	while(ch<48||ch>57) {
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>=48&&ch<=57) {
		x=(x<<3)+(x<<1)+(ch^48);
		ch=getchar();
	}
	return x*f;

}

int n,m,mlog=1,r[N];

void FFT(complex<double> *a,int x) {

	for(int i=0; i<mlog; i++) {
		if(i<r[i]) swap(a[i],a[r[i]]);
	}
	for(int i=1; i<mlog; i<<=1) {

		complex<double> X(cos(Pi/i),sin(Pi/i)*x);
		for(int j=0; j<mlog; j+=(i<<1)) {
			complex<double> Y(1,0);
			for(int k=0; k<i; k++,Y*=X) {
				complex<double> p=a[j+k],q=a[j+k+i]*Y;
				a[j+k]=p+q;
				a[j+k+i]=p-q;
			}
		}

	}

}

complex<double> a[N],b[N];

int main() {

	n=read();
	m=read();
	for(int i=0; i<=n; i++) a[i]=read();
	for(int i=0; i<=m; i++) b[i]=read();

	int t=0;
	for(mlog=1; mlog<=(m+n); mlog<<=1) t++;
	for(int i=0; i<mlog; i++) r[i]=(r[i>>1]>>1)|((i&1)<<(t-1));
	FFT(a,1);
	FFT(b,1);
	for(int i=0; i<=mlog; i++) a[i]*=b[i];
	FFT(a,-1);

	for(int i=0; i<=n+m; i++) printf("%d ",(int)(0.5+a[i].real()/mlog));

	return 0;
}

FFT优化高精度乘法

#include<bits/stdc++.h>
#define int long long
using namespace std;

typedef long long ll;
const int N=1e7+10;
const double Pi=acos(-1);

int read() {

	int x=0,f=1;
	char ch=getchar();
	while(ch<48||ch>57) {
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>=48&&ch<=57) {
		x=(x<<3)+(x<<1)+(ch^48);
		ch=getchar();
	}
	return x*f;

}

complex<double> a[N],b[N];
int n,m,mlog=1,r[N],c[N];

void FFT(complex<double> *a,int x) {

	for(int i=0; i<mlog; i++) {
		if(i<r[i]) swap(a[i],a[r[i]]);
	}
	for(int i=1; i<mlog; i<<=1) {

		complex<double> X(cos(Pi/i),sin(Pi/i)*x);
		for(int j=0; j<mlog; j+=(i<<1)) {
			complex<double> Y(1,0);
			for(int k=0; k<i; k++,Y=Y*X) {
				complex<double> p=a[j+k],q=a[j+k+i]*Y;
				a[j+k]=p+q;
				a[j+k+i]=p-q;
			}
		}

	}

}

string s1,s2;

signed main() {

	cin>>s1>>s2;
	int n=s1.length()-1,m=s2.length()-1;
	for(int i=0; i<=n; i++) a[n-i]=s1[i]-48;
	for(int i=0; i<=m; i++) b[m-i]=s2[i]-48;

	int t=0;
	for(mlog=1; mlog<=(m+n); mlog<<=1) t++;
	for(int i=0; i<mlog; i++) r[i]=(r[i>>1]>>1)|((i&1)<<(t-1));
	FFT(a,1);
	FFT(b,1);
	for(int i=0; i<=mlog; i++) a[i]=a[i]*b[i];
	FFT(a,-1);

	for(int i=0; i<=n+m+1; i++) c[i]=(0.5+a[i].real()/mlog);
	for(int i=0; i<=n+m; i++) {
		c[i+1]+=c[i]/10;
		c[i]%=10;
	}
	int k=n+m+1;
	while(c[k]) {
		c[k+1]+=c[k]/10;
		c[k]%=10;
		k++;
	}
	for(int i=k-1; i>=0; i--) printf("%lld",c[i]);

	return 0;
}

\(NTT\)

标签:ch,const,int,多项式,全家,long,Pi,getchar
From: https://www.cnblogs.com/Diamondan/p/17057579.html

相关文章

  • sklearn.preprocessing.PolynomialFeatures多项式特征
    ......
  • 多项式插值
    一个\(n-1\)次多项式,可以用\(n\)个点\((x_i,y_i)\)表示。知道了某个多项式上\(n\)个点的点值,可以用拉格朗日插值公式还原出多项式,或者求给定\(x\)的函数值。朴......
  • lupohan44/GamesHub docker版 限免游戏喜加一全家桶
    项目链接:https://github.com/lupohan44/GamesHub前置条件:境外服务器(境内请准备代理),已安装docker电报机器人token使用其他通知方式参考https://github.com/caronc/a......
  • 计算几何全家桶
    本文出现的代码我连到哪里测试都不知道,完全不保证正确性。指路wind_whisper神仙的博客。基础运算typedefdoubledb;constdbeps=1e-8;structV{ dbx,y;};inl......
  • 特征多项式
    特征多项式。暂时不知道有什么用处。特征多项式矩阵\[A=\left(\begin{matrix}a_{11}&a_{12}&\cdots&a_{1n}\\a_{21}&a_{22}&\cdots&a_{2n}\\\vdots&......
  • 多项式半家桶,但是未封装
    多项式乘法逆题意:给定\(n-1\)次多项式\(F(x)\),求多项式\(G(x)\),使得\(F(x)G(x)\equiv1\pmod{x^n}\)思路:设:\[F(x)g(x)\equiv1\pmod{x^m}\\\\\F......
  • ACM&OI 多项式算法专题
    ACM&OI基础数学算法专题一、FFT基础拉格朗日插值复数的运算性质和几何性质单位根和单位根反演快速傅里叶变换(FFT)的分治实现快速傅里叶逆变换(IFFT)快速傅里叶变换的......
  • 云原生人才培养计划2.0 之 消息产品「全家桶训练营」重磅来袭
    2021年8月,阿里云联合Linux基金会发布云原生人才培养计划2.0,协同开源生态力量,为云原生领域提供更具专业性的定向人才培养方式,帮助云原生时代的开发者更好地享受云红利,创造......
  • 学习笔记:多项式半家桶
    已经吃撑了多项式求逆对于多项式\(A(x)\),求多项式\(B(x)\),满足\(A(x)*B(x)\equiv1\pmod{x^n}\)。递归求解。求模\(x^n\)的逆元时,假设先求出了模\(x^{\l......
  • 多项式乘法(FTT、NTT),但主要是习题
    诈尸。摆了一个多月没写boke的BE是屑。基础知识/模板因为太屑了所以就直接放巨佬们的博客力。快速傅立叶变换[学习笔记&教程]信号,集合,多项式,以及各种......