bzoj 2179: FFT快速傅立叶

news/2024/7/6 1:38:00 标签: FFT

Description

给出两个n位10进制整数x和y,你需要计算x*y。

Input

第一行一个正整数n。 第二行描述一个位数为n的正整数x。 第三行描述一个位数为n的正整数y。

Output

输出一行,即x*y的结果。

Sample Input

1
3
4

Sample Output

12

数据范围:
n<=60000


贴个FFT的板子以后看

http://blog.csdn.net/iamzky/article/details/22712347

#include<cmath>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
double pi=acos(-1.0); // PI值  
struct complex
{
     double r,i;
     complex(double real=0.0,double image=0.0)
	 {
          r=real;
	      i=image;
     }
     // 以下为三种虚数运算的定义
     complex operator +(complex o) const
	 {
          return complex(r+o.r,i+o.i);
     }
     complex operator -(complex o) const
	 {
          return complex(r-o.r,i-o.i);
     }
     complex operator *(complex o) const
	 {
          return complex(r*o.r-i*o.i,r*o.i+i*o.r);
     }
};
complex a[1000001],b[1000001];
char x1[1000001],x2[1000001];
bool v[1000001];
int sum[1000001];
inline void brc(complex *a,int l) //二进制反转 
{
     memset(v,false,sizeof(v));
     int i;
     for(i=1;i<l-1;i++)
     {
          int x=i,y=0;
          int m=(int)log2(l)+0.1;
          if(v[x])
               continue;
          while(m!=0)
          {
               m--;
               y=y*2;
               y=(y|(x&1));
               x=x/2;
               /*y<<=1;
               y|=(x&1);
               x>>=1;*/
          }
          v[i]=true;
          v[y]=true;
          swap(a[i],a[y]);
     }
}
inline void fft(complex *y,int l,double on)
{
     int i,j,k;
     complex u,t;
     brc(y,l);//二进制反转
	 for(i=2;i<=l;i=i*2)
	 {
	      complex wn(cos(on*2*pi/i),sin(on*2*pi/i));
	      for(j=0;j<l;j+=i)
	      {
	           complex w(1,0);
	           for(k=j;k<j+i/2;k++)
	           {
	                u=y[k];
	                t=w*y[k+i/2];
	                y[k]=u+t;
	                y[k+i/2]=u-t;
	                w=w*wn;
	           }//蝴蝶操作 
	      }
	 }
	 if(on==-1)
	 {
	      for(i=0;i<l;i++)
	           y[i].r/=l;//IDFT
	 }
}
int main()
{
    	scanf("%s%s",x1,x2);
          int la=strlen(x1),lb=strlen(x2);
          int l=1;
          while(l<la*2||l<lb*2)
               l=l*2;
          int i;
          for(i=0;i<la;i++) // 倒置存入
          {
               a[i].r=x1[la-i-1]-'0';
               a[i].i=0.0;
          }
          for(i=la;i<l;i++)
          {
          	   a[i].r=0.0;
		       a[i].i=0.0;
		  }
          for(i=0;i<lb;i++)
          {
               b[i].r=x2[lb-i-1]-'0';
               b[i].i=0.0;
          }
          for(i=lb;i<l;i++)
          {
		       b[i].r=0.0;
			   b[i].i=0.0;
		  }
		  fft(a,l,1);//DFT
		  fft(b,l,1);//DFT
		  for(i=0;i<l;i++)
		       a[i]=a[i]*b[i];
		  fft(a,l,-1);//IDFT
		  for(i=0;i<l;i++)
		       sum[i]=a[i].r+0.5;
		  for(i=0;i<l;i++)
		  {
		       sum[i+1]+=sum[i]/10;
		       sum[i]%=10;
		  }
		  l=la+lb-1;
		  while(sum[l]==0)
		       l--;
		  for(i=l;i>=0;i--)
		       printf("%d",sum[i]);
		  printf("\n");
    // }
     return 0;
}



http://www.niftyadmin.cn/n/942851.html

相关文章

Matlab特殊矩阵

将Matlab特殊矩阵记录下来&#xff0c;方便日后需要可查询相关函数。 1.全0矩阵&#xff1a;zeros(); 2.单位矩阵&#xff1a;eye(); 3.全1矩阵&#xff1a;ones(); 4.均匀分布随机矩阵&#xff1a;rand(); 5.正态分布随机矩阵&#xff1a;randn(); 6.随机排列&#xff1a;rand…

bzoj 2194: 快速傅立叶之二

Description 请计算C[k]sigma(a[i]*b[i-k]) 其中 k < i < n &#xff0c;并且有 n < 10 ^ 5。 a,b中的元素均为小于等于100的非负整数。 Input 第一行一个整数N,接下来N行&#xff0c;第i2..iN-1行&#xff0c;每行两个数&#xff0c;依次表示a[i],b[i] (0 < i …

matlab中的mesh()函数和meshgrid()函数

mesh: https://blog.csdn.net/kobesdu/article/details/8640648 https://blog.csdn.net/Zz501306162/article/details/54287593 (meshmeshgrid) meshgrid: https://blog.csdn.net/hhhhhyyyyy8/article/details/76209094 mesh可以绘制三维图像。

bzoj 4127: Abs

Description 给定一棵树,设计数据结构支持以下操作1 u v d  表示将路径 (u,v) 加d2 u v 表示询问路径 (u,v) 上点权绝对值的和Input 第一行两个整数n和m&#xff0c;表示结点个数和操作数接下来一行n个整数a_i,表示点i的权值接下来n-1行,每行两个整数u,v表示存在一条(u,v)…

bzoj 2482: [Spoj1557] Can you answer these queries II

Description 给定n个元素的序列。 给出m个询问&#xff1a;求l[i]~r[i]的最大子段和&#xff08;可选空子段&#xff09;。 这个最大子段和有点特殊&#xff1a;一个数字在一段中出现了两次只算一次。 比如&#xff1a;1&#xff0c;2&#xff0c;3&#xff0c;2&#xff0c…

Matlab sort()函数

关于sort()函数&#xff0c;可参考以下两篇博客&#xff1a; https://blog.csdn.net/oppo62258801/article/details/63262587 https://blog.csdn.net/anqier1009/article/details/5213862 >> A[1:5;6:10;11:15]A 1 2 3 4 56 7 8 9 1011 …

bzoj 3747: [POI2015]Kinoman

Description 共有m部电影&#xff0c;编号为1~m&#xff0c;第i部电影的好看值为w[i]。在n天之中&#xff08;从1~n编号&#xff09;每天会放映一部电影&#xff0c;第i天放映的是第f[i]部。你可以选择l,r(1<l<r<n)&#xff0c;并观看第l,l1,…,r天内所有的电影。如果…

Matlab reshape,conv,pinv,inv,det函数

reshape()&#xff1a;都是将A 的行列排列成m行n列&#xff0c;reshape是 按照列取数据的 https://blog.csdn.net/smf0504/article/details/51811291 >> A rand(3,4)*10A 8.1472 9.1338 2.7850 9.64899.0579 6.3236 5.4688 1.57611.2699 0.9754 …