HDU1402 A * B Problem Plus[FFT]

HDU1402 A * B Problem Plus 大数乘法 FFT(快速傅里叶变换)优化 HDU1402 A * B Problem Plus 大数乘法 FFT(快速傅里叶变换)优化题目长度不超过5000,据称高精度会TLE,必须O(nlogn)O(nlogn),FFT首敲。代码bit_reverse_swap(a, n)参考自算法导论30.3的迭代实现,非递归方式完成下图过程。 #include <cstdio> #include <cmath> #include <complex> 阅读详情

题意:

计算A*B(A,B均不超过5e4位)。


题解:

计算A*B 可以把AB的各项化成多项式来相乘

把这两个多项式相乘起来就能得到A*B的结果了。

用FFT可以快速的求出两多项式相乘的结果,然后就可以得到每一位的的结果。

求得A*B的结果之后,做进位处理。

注意最后要去掉前导零,然后倒着输出。

这是第一次写的FFT的题目,所以代码上面有对模版的一些解释。



#pragma comment(linker, "/STACK:102400000,102400000")
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<vector>
using namespace std;
typedef long long ll;
const double PI=acos(-1.0);
const int N=5e4+5;
const int M=(1<<17)+5;//取大于2*N的2的幂
char A[N],B[N];
int ans[M];
struct Complex
{
    double real,image;
    Complex(double r=0.0,double i=0.0):real(r),image(i){};
    Complex operator + (const Complex &b)
    {
        return Complex(real+b.real,image+b.image);
    }
    Complex operator - (const Complex &b)
    {
        return Complex(real-b.real,image-b.image);
    }
    Complex operator * (const Complex &b)
    {
        return Complex(real*b.real-image*b.image,image*b.real+real*b.image);
    }
    Complex operator / (const Complex &b)
    {
        double r=(real*b.real+image*b.image)/(b.real*b.real+b.image*b.image);
        double i=(image*b.real-real*b.image)/(b.real*b.real+b.image*b.image);
        return Complex(r,i);
    }
}a[M],b[M];
/*
将当前项跟其二进制的倒序交换
倒序过程中
k的初始值是len/2 即可取的二进制的最高位
只有当j比当前的k要大,代表有进位,所以减去后
最后在j<k的时候,补上进位
*/
void change(Complex x[],int len)
{
    //0跟最后二进制全1的都不用处理,所以是len-1
    for (int i=1 , j=len/2 ; i<len-1 ; ++i)
    {
        if (i<j)
            swap(x[i],x[j]);
        //只有i比j小的时候交换,避免重复交换导致交换无效
        int k=len/2;
        while (j>=k)
        {
            j-=k;
            k/=2;
        }
        if (j<k)
            j+=k;
    }
}
/*
dft=1时是DFT dfs=-1时是逆DFT
len必须是2的幂
*/
void FFT(Complex x[],int len,int dft)
{
    change(x,len);
    for (int h=2 ; h<=len ; h<<=1)
    {
        Complex wn(cos(dft*2*PI/h),sin(dft*2*PI/h));
        for (int j=0 ; j<len ; j+=h)
        {
            Complex w(1,0);//旋转因子
            for (int k=j ; k<j+h/2 ; ++k)
            {
                Complex u=x[k];
                Complex t=w*x[k+h/2];
                x[k]=u+t;
                x[k+h/2]=u-t;
                w=w*wn;
            }
        }
    }
    if (dft==-1)
    {
        for (int i=0 ; i<len ; ++i)
        {
            x[i].real/=len;
            x[i].image/=len;
        }
    }
}
int main()
{
	while (~scanf("%s%s",A,B))
    {
        int lena=strlen(A),lenb=strlen(B);
        int len=1;
        /*得到最长的2*n*/
        while (len<lena*2 || len<lenb*2)
            len<<=1;
        /*将每一位拆开*/
        for (int i=0 ; i<len ; ++i)
        {
            if (i<lena)
                a[i]=Complex(A[lena-1-i]-'0',0);
            else
                a[i]=Complex(0,0);
            if (i<lenb)
                b[i]=Complex(B[lenb-1-i]-'0',0);
            else
                b[i]=Complex(0,0);
        }
        //DFT
        FFT(a,len,1);
        FFT(b,len,1);
        for (int i=0 ; i<len ; ++i)
            a[i]=a[i]*b[i];
        //DFT-1
        FFT(a,len,-1);
        memset(ans,0,sizeof(ans));
        for (int i=0 ; i<len ; ++i)
            ans[i]=(int)(a[i].real+0.5);//四舍五入取整
        for (int i=0 ; i<len ; ++i)
        {
            ans[i+1]+=ans[i]/10;//进位
            ans[i]%=10;
        }
        while (!ans[len] && len>0)
            len--;
        for (int i=len ; i>=0 ; --i)
            printf("%d",ans[i]);
        printf("\n");
    }
	return 0;
}








APM 飞行模式切换--源码详解 APM飞控中有很多种方式可以改变飞行模式。其中最常见的为遥控器切换和地面站切换两种方式。 下面以遥控器切换为例详解飞行模式切换逻辑。 APM遥控器切换飞行模式的源代码在RC_Channel.cpp文件中的RC_Channel_Copter::do_aux_function_change_mode()函数中。 const bool success = copter.set_mode()调用Copter::set_mode()函数,在set_mode()函数中调用mode_fro... 阅读详情

相关推荐

Opencv2.4.9源码分析——HoughCircles

图形可以用一些参数进行表示,标准霍夫变换的原理就是把图像空间转换成参数空间(即霍夫空间),例如霍夫变换的直线检测就是在距离-角度空间内进行检测。圆可以表示成: (x-a)2+(y-b)2=r2                   (1) 其中a和b表示圆心坐标,r表示圆半径,因此霍夫变换的圆检测就是在这三个参数组成的三维空间内进行检测。 原则上,霍夫变换可以检测任何形状。但复杂的形状需要的

赵春江的专栏 3万+

hdu 1402 A * B Problem Plus(FFT-大整数乘法)

Problem Description Calculate A * B.   Input Each line will contain two integers A and B. Process to end of file. Note: the length of each integer will not exceed 50000.

SSimpLe_Y的博客 865

Ventoy引导自定义菜单配置详解:手把手教你用ventoy_grub.cfg启动硬盘里的Manjaro

本文详细解析了Ventoy引导自定义菜单配置方法,重点介绍如何通过ventoy_grub.cfg文件启动硬盘中的Manjaro系统。从Ventoy与GRUB2的协作原理到具体配置步骤,包括分区布局设计、关键参数解析及常见问题解决方案,帮助用户实现多系统引导的灵活管理。

weixin_28738165的博客 298

【HDU - 1402】A * B Problem Plus (FFT)

Calculate A * B. Input Each line will contain two integers A and B. Process to end of file. Note: the length of each integer will not exceed 50000. Output For each case, output A * B in one li...

Coldfresh的博客 325

QT快速配置MSVC2017编译环境(3分钟极简指南)

本文提供了一份3分钟极简指南,帮助开发者快速配置QT的MSVC2017编译环境。通过断网安装、精准勾选组件和配置QT Creator编译器路径等步骤,大幅提升QT开发效率。MSVC2017作为Windows平台高性能C++编译器,特别适合处理大型QT项目,编译速度优势明显。

weixin_30399821的博客 502

【YOLOv8全方位学习手册】第四章 数据增强:从扩充数据到塑造模型的认知边界

"""使用 Albumentations 做自定义增强,兼容 YOLO 格式"""])# 转成 numpy# boxes 必须是 [[x_min,y_min,x_max,y_max], ...]# 在数据加载时调用你可以把集成到 PyTorch 的 Dataset 类里,或使用 Ultralytics 自带的DataLoader。

VectorShift的博客 211

[HDU1402]A * B Problem Plus

Problem descriptionLink 计算A*B,其中A,B的位数不超过50000Possible Solution高精乘:时间复杂度O(n^2)FFT :时间复杂度O(nlogn)将A,B两数的每个位当做多项式A(X),B(X)的系数,计算出A(X)*B(X)的系数,在进行进位。记得到C附代码:#include<cstdio> #include<cstring> #include<al

kufaaa的专栏 591

SolidWorks软件二次开发:使用C#进行SolidWorks二次开发

SolidWorks 提供的 API(应用程序编程接口)允许开发者使用多种编程语言(如 C#、VB.NET 等)来控制和扩展 SolidWorks 的功能。API 架构基于 COM(组件对象模型),这意味着开发者可以通过引用 SolidWorks 的类型库来访问其对象模型。SolidWorks 的对象模型包括了从文档、零件、装配体到特征、草图等所有 SolidWorks 中可操作的对象。

kkchenjj的博客 3212

hdu 1402 A * B Problem Plus(快速傅里叶变换模板)

快速傅里叶变换在这里的主要用处就是可以快速求出两个多项式的乘积,可以把两个大数转换成a1 + a2*x + a3*x^2......的形式,利用FFT快速求值。 #include #include #include #include #include using namespace std; const int maxn = 200000 + 7; const double PI =

THE___BEST的专栏 508

YOLOv11涨点改进 | 全网独家下采样改进、细节涨点篇 | TGRS 2025 | 引入PWD参数化小波下采样模块,减少下采样过程中小目标的关键细节丢失,即插即用,助力高效涨点发论文

本文提出了一种改进YOLOv11小目标检测性能的参数化小波下采样(PWD)模块。PWD通过小波变换保留目标细节信息,增强频率域特征表达,有效解决了传统下采样导致的小目标信息丢失问题。该模块采用双分支设计,结合自适应频率选择和空间补偿机制,在红外图像和低光场景中表现出更强的抗干扰能力。实验表明,PWD能显著提升YOLOv11对弱纹理和低对比度目标的检测精度,同时保持计算效率。文章详细介绍了PWD的结构原理、实现代码及在YOLOv11中的集成方法,为小目标检测提供了有效的改进方案。

Ai缝合怪、助力小伙伴高效发论文 232

uniapp [全端兼容] - 实现上传本地视频到后端服务器及在线预览播放视频+移除视频+进度条上传,将已选视频上传服务端并可预览视频和删除功能,上传单个或多个视频文件及大文件(H5、小程序、app)

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,uniapp+uview上传视频并预览,UNI-APP视频上传组件,实现视频文件上传视频回显,上传视频并预览、上传多个视频,实现上传视频功能+预览,上传显示视频功能,上传视频预览移除,批量上传视频,上传超大视频文件,视频上传并预览效果,uniapp上传视频,使用uview上传视频及预览,上传视频和删除视频功能,视频流上传播放功能,上传视频到后端,视频上传与实时预览功能,upload上传组件,视频播放器

🏆 前端领域优质创作者 1万+

HDU-1402-A*B Problem Plus

ACM模版题目链接A*B Problem Plus题解高精度乘法,使用FFT可以快速解决。代码#include <iostream> #include <cstring> #include <iostream> #include <algorithm> #include <cmath>using namespace std;// FFT/* * HDU 1402 求高精度乘法 * A *

逐梦者 1563

11、基于多阵列电极的表面肌电信号运动估计

本文介绍了一种基于多阵列电极的表面肌电信号运动估计技术,旨在实现对手腕和手指运动的高精度估计,解决传统人机接口在操控多自由度机器人时的局限性。通过多阵列电极系统采集前臂肌肉活动信号,结合独立成分分析(ICA)和非负矩阵分解(NMF)等信号处理方法,提取肌肉协同作用,进而生成运动指令以控制机器人或假肢手。文章对比了多阵列电极与传统电极的优势,展示了运动估计算法的整体流程,并以假肢手控制为例说明其实际应用。最后探讨了该技术在测量精度、应用拓展、智能化和便携化等方面的未来发展方向。该技术为假肢控制、康复训练和人机

ik678901234的博客 86

hdu 1402 A * B Problem Plus FFT

/* hdu 1402 A * B Problem Plus FFT 这是我的第二道FFT的题 第一题是完全照着别人的代码敲出来的,也不明白是什么意思 这个代码是在前一题的基础上改的 做完这个题,我才有点儿感觉,原来FFT在这里就是加速大整数乘法而已 像前一题,也是一个大整数乘法,然后去掉一些非法的情况 */ #pragma warning(disable : 4786) #pragm

1407

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

HDU_1402_A * B Problem Plus(FFT快速傅里叶变换)

题型:数论 题意:计算A*B 分析: 数字长度达50000,朴素的高精度,复杂度为O(n^2). 引出FFT(快速傅里叶变换) FFT能够在nlog(n)时间完成多项式相乘的计算。 设多项式: (1) 朴素计算A*B,需要O(n^2)复杂度 对于多项式,除了上式这样比较普遍的表示方法之外,还可以用类似于二维平面坐标的方式表示。 对于A,有(x0,a0)    

Light_starlight 871

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

HDU 1402 A * B Problem Plus(FFT)

题目链接:点击打开链接 题意:求大数 A * B。 思路:由于A 和 B太大了, 用java或者大数都会超时。 我们可以用所谓的快速傅立叶变换(FFT)求解多项式相乘的问题。 细节参见代码: #include #include #include #include #include #include #include #include #include #include #include #

AC_Arthur的专栏 1027

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

HDU1402 A * B Problem Plus (FFT)

题目 HDU1402 思路 把数字转化成∑ai∗10i\sum a_i*10^i∑ai​∗10i的形式,然后用FFTFFTFFT 代码 #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #include <cstdlib> #incl...

HolmiumJiang的博客 214

HDU 1402 A * B Problem Plus [FFT]【数论】

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1402 ———————————————————————————. A * B Problem PlusTime Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submissio

Tabris的博客 896

HDU 1402 A * B Problem Plus FFT

http://acm.hdu.edu.cn/showproblem.php?pid=1402 Calculate A * B. Input Each line will contain two integers A and B. Process to end of file. Note: the length of each integer will not exceed 50000. Outpu...

xiji333的博客 255

FFT hdu1402 A * B Problem Plus

传送门:点击打开链接 题意:求大数乘法 思路:fft套模板 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define fuck(x) c

qwb的博客 575

【FFT】 HDU 1402 A * B Problem Plus

通道:http://acm.hdu.edu.cn/showproblem.php?pid=1402 题意:计算A*B 代码: 1 #include <cstdio> 2 #include <cmath> 3 #include <cstring> 4 #include <algorithm> 5 6 us...

92

HDU - 1402,A * B Problem Plus,FFT板

HDU - 1402,A * B Problem Plus https://vjudge.net/problem/HDU-1402/origin Calculate A * B. 思路:FFT板题,贴个常数很小的板子 #include<bits/stdc++.h> #define ll long long #define ri register int #define MAXN 500...

xing_mo的博客 205

【HDU1402】【FFT】A * B Problem Plus

Problem Description Calculate A * B. Input Each line will contain two integers A and B. Process to end of file.Note: the length of each integer will not exceed 50000. Output For each case, o...

Gregory99174的博客 195

FFT - A * B Problem Plus - HDU 1402

FFT - A * B Problem Plus - HDU 1402 Problem Description Calculate A * B. Input Each line will contain two integers A and B. Process to end of file. Note: the length of each integer will not exceed 50000. Output For each case, output A * B in one line. Samp

njuptACMcxk的博客 249

HDU 1402 A * B Problem Plus (FFT, 大整数乘法)

题目大意: 求两个大整数的乘积, 两个大整数长度都不超过50000, 多组数据, 时限1s 大致思路: 作为FFT算法的一个开头的题, 恩还是仔细写了一下 这个题就是把整数视作是两个多项式, 每一位就是一项, 那么就相当于是两个最高次数不超过50000的多项式乘积之后在x = 10出的值, 那么这样就很简单了, 直接处理出其多项式然后用FFT计算即可, 试水题, 改进模板中...

Gatevin的专栏 5509
上一篇: UVALive6886 Golf Bot[FFT]
下一篇: Codeforces229A Shifts[二分]
ControlBear
博客等级 码龄11年 34粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值