多项式的各种算法

1.核心:
FFT:
正常版本:

#include<bits/stdc++.h>
#define maxn 400005
using namespace std;
const double PI = acos(-1);
	
struct cplx
{
   
	double r,i;
	cplx(double r=0,double i=0):r(r),i(i){
   }
	cplx operator +(const cplx &B)const{
    return cplx(r+B.r,i+B.i); }
	cplx operator -(const cplx &B)const{
    return cplx(r-B.r,i-B.i); }
	cplx operator *(const cplx &B)const{
    return cplx(r*B.r-i*B.i,i*B.r+r*B.i); }
	cplx conj(){
    return cplx(r,-i); }
}a[maxn],b[maxn];
int r[maxn]={
   };
cplx w[maxn] = {
   1};

inline void FFT(cplx *A,int lgn,int tp)
{
   
	int n = 1<<lgn;
	for(int i=1;i<n;i++) r[i] = (r[i>>1]>>1) | ((i&1)<<(lgn-1));
	for(int i=1;i<n;i++) if(i < r[i]) swap(A[i] , A[r[i]]);
	for(int len=2;len<=n;len<<=1){
   
		int l = len >> 1;cplx wn(cos(PI / l) , sin(PI / l) * tp);
		for(int i=1;i<l;i++) w[i] = w[i-1] * wn;
		for(int st = 0;st < n;st += len) for(int k=0;k<l;k++)
		{
   
			cplx tmp = w[k] * A[st + k + l];
			A[st + k + l] = A[st + k] - tmp , A[st + k] = A[st + k] + tmp;
		}
	}
	if(tp==-1) for(int i=0;i<n;i++) A[i].r /= n;
}


int main()
{
   
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=0;i<=n;i++) scanf("%lf",&a[i].r);
	for(int i=0;i<=m;i++) scanf("%lf",&a[i].i);
	n++,m++;
	int len = 0;
	for(;n+m>(1<<len);len++);
	FFT(a,len,1);
	for(int i=0,ci,Len = 1<<len;i<Len;i++)
	{
   
		ci = (Len - i) & (Len - 1);
		cplx A = (a[i] + a[ci].conj())*cplx(0.5,0) , B = (a[i] - a[ci].conj())*cplx(0,-0.5);
		b[i] = A * B;
	}
	FFT(b,len,-1);
	for(int i=0;i<n+m-1;i++) printf("%d ",int(b[i].r+0.5));
}

预处理单位元(精度高):

#include<bits/stdc++.h>
#define maxn 300005
using namespace std;

const double Pi = 3.1415926535897932384626433832795;
struct cplx
{
   
	double r,i;
	cplx(double r=0,double i=0):r(r),i(i){
   }
	cplx operator +(const cplx &B)const{
    return cplx(r+B.r,i+B.i); }
	cplx operator -(const cplx &B)const{
    return cplx(r-B.r,i-B.i); }
	cplx operator *(const cplx &B)const{
    return cplx(r*B.r-i*B.i,i*B.r+r*B.i); }
	cplx conj()const{
    return cplx(r,-i); }
}w[maxn],A[maxn],B[maxn];
int r[maxn];
inline void FFT(cplx A[maxn],int lgn,int tp)
{
   
	int n = 1<<lgn;
	for(int i=0;i<n;i++) w[i]=cplx(cos(i*Pi/n),sin(i*Pi/n));
	for(int i=0;i<n;i++) r[i] = (r[i>>1]>>1)|((i&1)<<(lgn-1));
	for(int i=0;i<n;i++) if(i < r[i]) swap(A[i] , A[r[i]]);
	for(int L=2;L<=n;L<<=1)
		for(int st=0,l=L>>1;st<n;st+=L)
			for(int k=0,lc=0,inc=n/l;k<l;k++,lc+=inc)
			{
   
				cplx tmp = (tp==1 ? w[lc] : w[lc].conj()) * A[st+k+l];
				A[st+k+l]=A[st+k]-tmp,A[st+k]=A[st+k]+tmp;
			}
	if(tp==-1) for(int i=0;i<n;i++) A[i].r/=n,A[i].i/=n;
}

int main()
{
   
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=0;i<=n;i++) scanf("%lf",&A[i].r);
	for(int i=0;i<=m;i++) scanf("%lf",&A[i].i);
	int lgn=0;for(;n+m>=(1<<lgn);lgn++);
	FFT(A,lgn,1);
	for(int i=0,len=1<<lgn;i<len;i++)
	{
   
		cplx u=A[i],v=A[(len-1)&(len-i)].conj();
		B[i]=(u+v)*(u-v)*cplx(0,-0.25);
	}
	FFT(B,lgn,-1);
	for(int i=0;i<n+m;i++) printf("%d ",int(round(B[i].r)));
	printf("%d\n",(int)round(B[n+m].r));
}

U P D : 1.0 K B   F F T \mathrm {UPD :1.0 KB\ FFT} UPD:1.0KB FFT

#include<bits/stdc++.h>
#define maxn 300005
#define cp complex<double>
#define Pi 3.1415926535897932384626433832795
#define rep(i,j,k) for(int i=(j);i<=(k);i++)
#define per(i,j,k) for(int i=(j);i>=(k);i--)
using namespace std;

int Wl,lg[maxn],r[maxn];
cp W[maxn];
void init(int n){
   
	for(Wl=1;n>=2*Wl;Wl<<=1);
	rep(i,0,Wl<<1) W[i]=exp(cp(0,i*Pi/Wl)),(i>1)&&(lg[i]=lg[i>>1]+1);
}
void FFT(cp *A,int n,int tp){
   
	rep(i,1,n-1) (i<(r[i]=(r[i>>1]>>1)|((i&1)<<(lg[n]-1))))&&(swap(A[i],A[r[i]]),0);cp t;
	for(int L=1,B=Wl;L<n;L<<=1,B>>=1) for(int s=0;s<n;s+=L<<1) for(int k=s,x=0;k<s+L;k++,x+=B) 
		t=(tp==1?W[x]:conj(W[x]))*A[k+L],A[k+L]=A[k]-t,A[k]+=t;
	if(tp^1) rep(i,0,n-1) A[i]/=n;
}
int n,m;cp A[maxn],B[maxn];
int main(){
   
	scanf("%d%d",&n,&m);
	double x;
	rep(i,0,n) scanf("%lf",&x),A[i].real(x);
	rep(i,0,m) scanf("%lf",&x),B[i].real(x);
	init(n+m);
	FFT(A,Wl<<1,1),FFT(B,Wl<<1,1);
	rep(i,0,(Wl<<1)-1) A[i]*=B[i];
	FFT(A,Wl<<1,-1);
	rep(i,0,n+m) printf("%d%c",(int)round(A[i].real())," \n"[i==n+m]);
}

MTT
合并DFT详见myy论文。
合并IDFT其实不需要任何技巧因为:
I D F T ( D F T ( A ( i ) ) + i D F T ( B ( i ) ) ) = A ( i ) + i B ( i ) IDFT(DFT(A(i)) + iDFT(B(i))) = A(i) + iB(i) IDFT(DFT(A(i))+iDFT(B(i)))=A(i)+iB(i)
如果觉得慢的话可以将 l o n g   d o u b l e \mathrm {long\ double} long double改为 d o u b l e \mathrm {double} double
然后预处理单位根照样可以满足 1 0 5 10^5 105的精度要求

#include<bits/stdc++.h>
#define maxn 300005
#define LL long long
#define M ((1<<15)-1)
#define ld long double
using namespace std;

char cb[1<<15],*cs=cb,*ct=cb;
#define getc() (cs==ct&&(ct=(cs=cb)+fread(cb,1,1<<15,stdin),cs==ct)?0:*cs++)
inline void read(int &res){
    char ch;for(;!isdigit(ch=getc()););for(res=ch-'0';isdigit(ch=getc());res=res*10+ch-'0'); }

int p;
const ld Pi = 3.1415926535897932384626433832795;
struct cplx
{
   
	ld r,i;
	cplx(ld r=0,ld i=0):r(r),i(i){
   }
	cplx operator +(const cplx &B)const{
    return cplx(r+B.r,i+B.i); }
	cplx operator -(const cplx &B)const{
    return cplx(r-B.r,i-B.i); }
	cplx operator *(const cplx &B)const{
    return cplx(r*B.r-i*B.i,i*B.r+B.i*r); }
	cplx conj(){
    return cplx(r,-i); }
}w[maxn]={
   1};
int a[maxn],b[maxn],c[maxn],r[maxn];

inline void FFT(cplx A[maxn],int lgn,int tp)
{
   
	int n = 1<<lgn;
	for(int i=1;i<n;i++) r[i] = (r[i>>1]>>1)|((i&1)<<(lgn-1));
	for(int i=1;i<n;i++) if(i<r[i])swap(A[i],A[r[i]]);
	for(int L=2;L<=n;L<<=1)
	{
   	int l=L>>1;w[1]=cplx(cos(Pi/l),sin(Pi/l)*tp);
		for(int i=2;i<l;i++) w[i] = w[i-1] * w[1];
		for(int st=0;st<n;st+=L)
			for(int k=0;k<l;k++)
			{
   
				cplx tmp = w[k] * A[st+k+l];
				A[st+k+l] = A[st+k]-tmp , A[st+k] = A[st+k] + tmp;
			}
	}
	if(tp == -1) for(int i=0;i<n;i++) A[i].r/=n,A[i].i/=n;
}

cplx s[4][maxn];
inline void mul(int a[maxn],int b[maxn],int lgn,int c[maxn])
{
   
	int n = 1<<lgn;
	for(int i=0;i<n;i++) s[0][i] = cplx(a[i]>>15,b[i]>>15) , s[1][i] = cplx(a[i]&M,b[i]&M);
	FFT(s[0],lgn,1),FFT(s[1],lgn,1);
	for(int i=0;i
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值