首页 > 其他分享 >FFT&hash

FFT&hash

时间:2024-06-06 10:00:34浏览次数:19  
标签:ch hash int FFT Complex return define const

1.FFT常看常新啊,比如突然发现complex比手写快!
注意实部和虚部的函数分别是real()和imag()

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(j);i<=(k);++i)
#define dow(i,j,k) for(int i=(j);i>=(k);--i)
#define pr pair
#define pb push_back
#define mkp make_pair
#define fi first
#define se second
#define Complex complex<double> 
inline int read(int &x) {
	x=0;int ff=1;char ch=getchar();
	while (ch<'0'||ch>'9') {
		if (ch=='-') ff=-1;ch=getchar();
	}
	while (ch>='0'&&ch<='9') {
		x=x*10+ch-48;ch=getchar();
	}
	x*=ff;
	return x;
}
void write(int x) {
  if (x > 9)write(x / 10);
  putchar((x % 10) + '0');
}
//struct Complex 感觉不如std::complex<double>...速度 
//{
//    double x, y;
//    Complex (double x = 0, double y = 0) : x(x), y(y) { }
//};
//Complex operator * (const Complex &J, const Complex & Q) {
//    //模长相乘,幅度相加
//    return Complex(J.x * Q.x - J.y * Q.y, J.x * Q.y + J.y * Q.x);
//}
//Complex operator - (const Complex & J, const Complex & Q) {
//    return Complex(J.x - Q.x, J.y - Q.y);
//}
//Complex operator + (const Complex & J,const Complex & Q) {
//    return Complex(J.x + Q.x, J.y + Q.y);
//}
int max(int a,int b) {return a>b?a:b;}
int min(int a,int b) {return a>b?b:a;}
int exgcd(int a,int b,int&x,int&y) {
	if(b==0) {x=1,y=0 ;return a ;} 
	else {int r=exgcd(b,a%b,x,y);int t=x ;x=y ;y=t-a/b*y ;return r ;}
}
int fpow(int x,int y) { 
	int ans=1;int base=x;
	while(y) {
		if(y&1)ans=ans*base;
		y/=2;base=base*base;
	}
	return ans;
}
int mod=1e9+7;
const int maxn=4000301;
int die[maxn]; const double PI=acos(-1);
void FFT(int lim,Complex*a,double t){
	
	if(lim==1){
		return ;
	}
	for(int i=0;i<lim;i++){
		if(i<die[i])
		swap(a[i],a[die[i]]);
	}
	for(int mid=1;mid<lim;mid*=2){
		Complex wn=Complex(cos(PI/mid),t*sin(PI/mid)); 
		
		// 对于长度为2*mid的区间,从mid合并.f(w_n^k)=f1(w_n^2k)+-w_n^k*f2(w_n^2k)=f(w_n^k)=f1(w_n/2^k)+-w_n^k*f2(w_n/2^k) 
		for(int st=0;st<lim;st+=(mid<<1)){ //枚举用于合并新区间的点 
			Complex w=Complex(1,0);
			for(int k=0;k<mid;k++,w=w*wn){
				Complex x=a[st+k];
				Complex y=w*a[st+k+mid];
				a[st+k]=x+y;
				a[st+k+mid]=x-y;
			} 
		}
	}
	if(t<0){
		rep(i,0,lim-1){
			a[i]/=lim;
		}
	}	
}
Complex b[maxn],a[maxn];int n,m;
signed main() {
	
	//freopen("data.in","r",stdin);
	//freopen("T1.out","w",stdout);
	read(n);read(m);
	int lim=1;//一个n次多项式需要n+1个点,w_n的n为n+1 
	int cont=0;
	int x;
	rep(i,0,n){
		read(x);
		a[i]=Complex(x,0);
	}
	rep(i,0,m){
		read(x);
		a[i]+=Complex(0,x);
	}
	while(lim<=2*max(n,m)){
		lim<<=1;
		cont++; 
	}
	rep(i,0,lim-1){
		if(cont)
		die[i]=(die[(i>>1)]>>1)|((i&1)<<(cont-1));
	}
	FFT(lim,a,1.0);
//	FFT(lim,b,1.0); FFT是把系数变点值,或者给虚部乘上-1来把点值变系数,所以在卷实数系数时可以把第二个多项式放在虚部然后按照式子把f^2的虚部除以二 
	rep(i,0,lim-1){//这里不能是n+m,必须是lim 你本质上是在对一个lim项的多项式做变换,需要lim个点
		a[i]=a[i]*a[i];
	}
	FFT(lim,a,-1.0);

	rep(i,0,n+m){
		
		cout<<(int)(a[i].imag()/2+0.5)<<" ";//四舍五入就是很对,不懂
	}
	 
	return 0;
}
/*
5 5
1 7 4 0 9 4 
8 8 2 4 5 5 
*/
//感觉可以用这个来哈希字符串
for(char c : __TIME__  __TIMESTAMP__) {
		x += c, x ^= x << 13, x ^= x >> 7, x ^= x << 17;
	}

标签:ch,hash,int,FFT,Complex,return,define,const
From: https://www.cnblogs.com/WXk-k/p/18234243

相关文章

  • 27、matlab傅里叶变换:fft()函数
    1、fft 快速傅里叶变换语法Y=fft(X)使用快速傅里叶变换(FFT)算法计算X的离散傅里叶变换(DFT)。Y=fft(X,n)返回n点DFT。Y=fft(X,n,dim)返回沿维度dim的傅里叶变换。例如,如果X是矩阵,则fft(X,n,2)返回每行的n点傅里叶变换含噪信号1)原始信号加噪声......
  • 基于FPGA的图像一维FFT变换IFFT逆变换verilog实现,包含tb测试文件和MATLAB辅助验证
    目录1.算法运行效果图预览2.算法运行软件版本3.部分核心程序4.算法理论概述5.算法完整程序工程1.算法运行效果图预览fpga仿真结果matlab调用FPGA的仿真结果进行图像显示2.算法运行软件版本vivado2019.2matlab2022a3.部分核心程序..................................
  • 【图解】HashMap1.7 头插法造成死循环
    1.概述HashMap1.7当中,扩容的时候,采用的是头插法转移结点,在多线程并发的情况下会造成链表死循环的问题。HashMap1.8中改为了尾插法,解决扩容时线程并发产生的死循环问题。2.图解假设有两个线程,线程1和线程2,两个线程进行hashMap的put操作,触发了扩容。下面是扩容的时候结点转移的......
  • FFT 学习笔记
    FFT学习笔记1.多项式与卷积1.1多项式对于多项式\(F(x)=a_0+a_1x+a_2x^2+a_3x^3+\dots+a_nx^n\),我们称\(a_0,a_1,\dots,a_n\)为它的系数,这种表示法叫做系数表示法。定义\(F(x)\)的\(n\)次项系数为\(f_n\)。我们有:\[F(x)=\sum_{i=0}^nf_ix^i\]1.2卷积考虑两个多......
  • Redis之hash
    Redis哈希(Hash)hash的格式也是键值对key:map,只不过他的值是map集合。key:{key:vlaue}案例127.0.0.1:6379>HSETmyhashfield1lili#set一个具体的key-value(integer)1127.0.0.1:6379>HGETmyhashfield1"lili"127.0.0.1:6379>HSETmyhashf......
  • STM32F407 hal库FFT
    简介:本文所用开发板为立创天空星,主控芯片为STM32F407VET6,F407系列应该都能使用本文的方法。也推荐大家可以买一块立创天空星玩玩,很好用。1.设置调试模式为SWD调试2.将低速和高速时钟设置为外部时钟源3.时钟设置(按下图即可)4.设置ADC,可以和中断部分一起看注意DMA设定时......
  • JS面试题:hash和history的区别
    一、hash模式和history模式的介绍由于Vue项目为单页面应用,所以整个项目在开发和构建过程中,仅存在一个HTML物理文件。通过路由系统可以实现将项目的组件与可访问的URL路径进行绑定。由于Vue项目只有一个HTML物理文件,切换页面时既需要让访问的URL路径发生变化,又不能触发H......
  • 导入ZIP压缩包比较图片的hash值重复
    项目中碰到需要在导入过程中和当前目录中的图片进行比较,判断是否存在相同的图片,相同则把导入的图片删除掉该内容较多:需要仔细分析每部分代码,结合你需要内容获取对应代码!!!!!!!!首先把工具类导入进来:对应hash比较工具类我是参考该作者博客:java通过哈希比较图片相似度_jav......
  • [数据结构+二叉树+B-Tree和红黑树与B+Tree与hashMap原理+ concurrentHashMap的原理]析
    目录数据结构:你了解过哪些数据结构:这些数据结构的优缺点:二叉树:特点:二叉树适合做磁盘存储吗: 缺点:B-Tree:b-树的查找过程:思考:特点:B+Tree: B+树搜索过程与B树的查询过程没有区别。但实际上有三点不一样:(B+Tree优势)简述B+Tree:不经历IO的情况下,可以直接......
  • hashtable的常用方法
    哈希表的定义和查找方法就不再赘述,此随笔主要写代码中的用法加深自己印象。声明哈希表:#include<unordered_map>unordered_map<eleType_1,eleType_2>var_name;unordered_map<int,int>map;//或者之前用过的charint类型,char为key,int为char的值。后面的变量为两个unordered......