\([Link](https://www.luogu.org/problemnew/show/P2553)\)

\(\color{red}{\mathcal{Description}}\)

给出两个多项式的乘积表达式,请求出它的结果。

啥?乘积表达式?哦,就是酱紫的:

\((4a^3 + 6a^2 + a ^ 1 + 3) * (3a^2 + a ^ 1 + 2)\)

嗯,那么它的结果也要写成这样\(qwq\)但是在这里就不举例子了\(qwq\)

\(\color{red}{\mathcal{Solution}}\)

\(emmmm\)其实吧,我根本不想做这个题,一看是要你扣数的题就觉得……十分的不可做。但是由于我刷了一下午的简单码力题,所以看到这道题感到很亲切\(qwq\)

但是!但是!但是!但是!——

这道题提供的输入的多项式们里,居然可以没有乘号!?并且这种情况应该忽略!?

好吧,还能不能好好地考察FFT了????

qwq真是毒瘤啊……并且好像在Luogu上这个题只有一个测试点……哇塞……只有一个你还那么坑……QAQ、

嗯,这道很迷的题就这么做完啦!

#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#define MAXN 100010
#define il inline const double pi = acos(-1.0) ;
using namespace std ;
bool mark ; char s [MAXN << 1];
int last, i, j, k, l, r[MAXN] ;
int F, L, Lim, to, now, tot1, tot2 ;
struct nodes{
double x, y ;
nodes (double xx = 0, double yy = 0){
x = xx, y = yy ;
}
}A[MAXN], B[MAXN], T1[MAXN], T2[MAXN] ;
nodes operator * (nodes J, nodes Q) {return nodes(J.x * Q.x - J.y * Q.y , J.x * Q.y + J.y * Q.x) ;}
nodes operator + (nodes J, nodes Q) {return nodes(J.x + Q.x , J.y + Q.y) ;}
nodes operator - (nodes J, nodes Q) {return nodes(J.x - Q.x , J.y - Q.y ) ;} il bool read(int pos){
now = 0, to = 0 ;
while(isdigit(s[pos])) now = now * 10 + s[pos] - 48, pos ++, to ++ ;
return to ;
}
il void init(){
Lim = 1, L = strlen(s), mark = 1, F = tot1 = tot2 = l = 0 ;
for(i = 0 ; i < L; i ++) if(s[i] == '*') F = 1 ;
if(!F) return ;
memset(A, 0, sizeof(A)), memset(B, 0, sizeof(B)), memset(T1, 0, sizeof(T1)), memset(T2, 0, sizeof(T2));
}
il void prepare(){
for(i = 0; i < L && s[i] != '*'; i ++){
if(read(i)) if(s[i - 1]!= '^') T1[++ tot1].x = now * mark, mark = 1;
else if(s[i] == '+') mark = 1 ;
else if(s[i] == '-') mark = -1 ;
i += ((!to)?to : (to - 1)), last = i ;
}
for(i = 1; i <= tot1; i ++) A[tot1 - i].x = T1[i].x ; tot1 -- ;
for(i = last + 1; i < L; i ++){
if(read(i)) if(s[i - 1]!= '^') T2[++ tot2].x = now * mark, mark = 1 ;
else if(s[i] == '+') mark = 1 ;
else if(s[i] == '-') mark = -1 ;
i += ((!to)?to : (to - 1)) ;
}
for(i = 1; i <= tot2; i ++) B[tot2 - i].x = T2[i].x ; tot2 -- ;
}
il void FFT(nodes *J, double flag){
for(i = 0; i < Lim; i ++)
if(i < r[i]) swap(J[i], J[r[i]]) ;
for(j = 1; j < Lim; j <<= 1){
nodes base(cos(pi / j), flag * sin(pi / j)) ;
for(k = 0; k < Lim; k += (j << 1) ){
nodes t(1, 0) ;
for(l = 0 ; l < j; l ++, t = t * base){
nodes Nx = J[k + l], Ny = t * J[k + j + l] ;
J[k + l] = Nx + Ny ;
J[k + j + l] = Nx - Ny ;
}
}
}
}
int main(){
while(gets(s)){
init();
if(!F) continue ;
prepare() ;
while(Lim <= tot1 + tot2) Lim <<= 1, l ++ ;
for(i = 0; i < Lim; i ++ ) r[i] = (r[i >> 1] >> 1) | ((i & 1) << (l - 1)) ;
FFT(A, 1), FFT(B, 1) ;
for(i = 0; i <= Lim; i ++) A[i] = A[i] * B[i] ;
FFT(A, -1) ;
for(i = tot1 + tot2; i > 0 ; i --){
printf("%da^%d", (int)(A[i].x / Lim + 0.5), i);
if(A[i].x / Lim + 0.5 > 0) putchar('+') ;
else putchar('-') ;
}
cout << (int)(A[0].x / Lim + 0.5) << endl ;
}
}

\(4ms\)……还挺快?看来我常数挺小的\(233\).

[AHOI2001]多项式乘法的更多相关文章

  1. luogu P2553 [AHOI2001]多项式乘法

    传送门 这题就是普及暴力模拟板子FFT板子,只要把多项式读入进来FFT一下就好了(不会的右转P3803) 重点是读入,我本以为这个字符串里到处都有空格,这里提供一种简单思路: 因为里面可能有空格,所以 ...

  2. 【洛谷 P2553】 [AHOI2001]多项式乘法(FFT)

    题目链接 简单处理一下输入,\(fft\)模板题. #include <cstdio> #include <cmath> #include <algorithm> ...

  3. [UOJ#34]多项式乘法

    [UOJ#34]多项式乘法 试题描述 这是一道模板题. 给你两个多项式,请输出乘起来后的多项式. 输入 第一行两个整数 n 和 m,分别表示两个多项式的次数. 第二行 n+1 个整数,分别表示第一个多 ...

  4. [笔记]ACM笔记 - 利用FFT求卷积(求多项式乘法)

    卷积 给定向量:, 向量和: 数量积(内积.点积): 卷积:,其中 例如: 卷积的最典型的应用就是多项式乘法(多项式乘法就是求卷积).以下就用多项式乘法来描述.举例卷积与DFT. 关于多项式 对于多项 ...

  5. FFT模板(多项式乘法)

    FFT模板(多项式乘法) 标签: FFT 扯淡 一晚上都用来捣鼓这个东西了...... 这里贴一位神犇的博客,我认为讲的比较清楚了.(刚好适合我这种复数都没学的) http://blog.csdn.n ...

  6. 【Uoj34】多项式乘法(NTT,FFT)

    [Uoj34]多项式乘法(NTT,FFT) 题面 uoj 题解 首先多项式乘法用\(FFT\)是一个很久很久以前就写过的东西 直接贴一下代码吧.. #include<iostream> # ...

  7. 【learning】多项式乘法&fft

    [吐槽] 以前一直觉得这个东西十分高端完全不会qwq 但是向lyy.yxq.yww.dtz等dalao们学习之后发现这个东西的代码实现其实极其简洁 于是趁着还没有忘记赶紧来写一篇博 (说起来这篇东西的 ...

  8. 多项式乘法(FFT)学习笔记

    ------------------------------------------本文只探讨多项式乘法(FFT)在信息学中的应用如有错误或不明欢迎指出或提问,在此不胜感激 多项式 1.系数表示法  ...

  9. FFT/NTT总结+洛谷P3803 【模板】多项式乘法(FFT)(FFT/NTT)

    前言 众所周知,这两个东西都是用来算多项式乘法的. 对于这种常人思维难以理解的东西,就少些理解,多背板子吧! 因此只总结一下思路和代码,什么概念和推式子就靠巨佬们吧 推荐自为风月马前卒巨佬的概念和定理 ...

随机推荐

  1. Oracle数据库基本操作 (五) —— 使用java调用存储过程

    一.环境准备 登录Oracle数据库scott账号,利用emp进行操作. 1.创建 proc_getyearsal 存储过程 -- 获取指定员工年薪 create or replace procedu ...

  2. php格式化保留2位小数

    <td align="center"><?php echo sprintf("%.2f",$v[r][red_bag_money]);?> ...

  3. python中字典,没键加键,有键操作其键对应的值,的思想

    cars = ['鲁A32444', '鲁B12333', '京B8989M', '黑C49678', '黑C46555', '沪B25041', '黑C34567'] locations = {'沪 ...

  4. HTML基本结构及标签样式

    <!DOCTYPE html>————声明 <html> <head>————头部设置信息 <title>文件标题</title> < ...

  5. [HNOI2006]最短母串问题

    题目大意:给定一个字符串集,求一个最短字串,使得该集合内的串都是该串的一个子串 算法:AC自动机+最短路+状压DP 注意空间限制 #include"cstdio" #include ...

  6. html5 区块与内联div 与span html块级元素

    HTML <div> 和 <span> HTML 列表 HTML 类 可以通过 <div> 和 <span> 将 HTML 元素组合起来. HTML 块 ...

  7. LintCode2016年8月22日算法比赛----克隆二叉树

    克隆二叉树 题目描述 深度复制一个二叉树. 给定一个二叉树,返回一个它的克隆品. 样例 给定一个二叉树: 1 / \ 2 3 / \ 4 5 返回其相同结构相同数值的克隆二叉树: 1 / \ 2 3 ...

  8. Creating dynamic/configurable parameterized queries in Entity Framework

    https://dillieodigital.wordpress.com/2013/05/09/creating-dynamicconfigurable-parameterized-queries-i ...

  9. MUI框架-02-注意事项-适用场景-实现页面间传值

    MUI框架-02-注意事项-适用场景-实现页面间传值 关于开发,我拷贝太多也没什么意义,就请查阅:官方文档:http://dev.dcloud.net.cn/mui/ui/ 快速入门 - 注意事项 有 ...

  10. Hadoop完全分布分布式配置

    1.准备三台虚拟机.安装Ubuntu操作系统,具体过程省略 2.三台虚拟机上分别安装Java环境,具体过程省略(保证三者的Java路径一致) 3.三台机器分别配置ssh本机免密码登录 (1)安装ssh ...