hdu 5730 Shell Necklace——多项式求逆+拆系数FFT

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5730

可以用分治FFT。但自己只写了多项式求逆。

和COGS2259几乎很像。设A(x),指数是长度,系数是方案。 \( A(x)^{k} \) 的 m 次项系数表示 k 个连续段组成长度为 m 的序列的方案数。

\( B(x)=1+F(x)+F^{2}(x)+F^{3}(x)+... \)

\( B(x) = \frac{1}{1-F(x)} \)(通过计算B(x)的逆来看出这个式子)

然后多项式求逆就行了。

注意模数 \( 313=2^{3}*3*13 \) ,原根是10,但那个 23 太小了!如果 len 大于3的话就会除出小数,所以不能直接用NTT!

那么就用FFT。FFT不能中途取模,所以最大的值是 312×312×10000=9734400000,会让FFT的精度变得很低。所以用拆系数FFT。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define db double
#define ll long long
using namespace std;
const int N=1e5+5,M=(1<<18)+5,mod=313;
const db pi=acos(-1);
int n,a[M],b[M],tp[M],len,r[M],base;
struct cpl{db x,y;}A[M],B[M],Ta[M],Tb[M],Tc[M],Td[M],Ini,I;
cpl operator+ (cpl a,cpl b){return (cpl){a.x+b.x,a.y+b.y};}
cpl operator- (cpl a,cpl b){return (cpl){a.x-b.x,a.y-b.y};}
cpl operator* (cpl a,cpl b){return (cpl){a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x};}
cpl cnj(cpl a){return (cpl){a.x,-a.y};}
int rdn()
{int ret=0;bool fx=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')fx=0;ch=getchar();}while(ch>='0'&&ch<='9') ret=ret*10+ch-'0',ch=getchar();return fx?ret:-ret;
}
void upd(int &x){x>=mod?x-=mod:0;}
int pw(int x,int k)
{int ret=1;while(k){if(k&1)ret=(ll)ret*x%mod;x=(ll)x*x%mod;k>>=1;}return ret;}
void fft(cpl *a,bool fx)
{for(int i=1;i<len;i++)if(i<r[i])swap(a[i],a[r[i]]);for(int R=2;R<=len;R<<=1){int m=R>>1;cpl wn=(cpl){ cos(pi/m),fx?-sin(pi/m):sin(pi/m) };for(int i=0;i<len;i+=R){cpl w=I;for(int j=0;j<m;j++,w=w*wn){cpl x=a[i+j], y=w*a[i+m+j];a[i+j]=x+y;  a[i+m+j]=x-y;}}}if(!fx)return;for(int i=0;i<len;i++)a[i].x/=len,a[i].y/=len;
}
void mtt(int n,int *a,int *b,int *c)
{for(len=1;len<n<<1;len<<=1);for(int i=0;i<len;i++)r[i]=(r[i>>1]>>1)+((i&1)?len>>1:0);for(int i=0;i<n;i++)A[i]=(cpl){ a[i]/base,a[i]%base }; for(int i=n;i<len;i++)A[i]=Ini;for(int i=0;i<n;i++)B[i]=(cpl){ b[i]/base,b[i]%base }; for(int i=n;i<len;i++)B[i]=Ini;fft(A,0);  fft(B,0);cpl ta,tb,tc,td;A[len]=A[0]; B[len]=B[0];for(int i=0,j=len;i<len;i++,j--){ta=(A[i]+cnj(A[j]))*(cpl){0.5,0};tb=(A[i]-cnj(A[j]))*(cpl){0,-0.5};tc=(B[i]+cnj(B[j]))*(cpl){0.5,0};td=(B[i]-cnj(B[j]))*(cpl){0,-0.5};Ta[i]=ta*tc; Tb[i]=ta*td; Tc[i]=tb*tc; Td[i]=tb*td;}A[len]=B[len]=Ini;for(int i=0;i<len;i++)A[i]=Ta[i]+Tb[i]*(cpl){0,1};for(int i=0;i<len;i++)B[i]=Tc[i]+Td[i]*(cpl){0,1};fft(A,1);  fft(B,1);for(int i=0,Da,Db,Dc,Dd;i<n;i++){Da=(ll)(A[i].x+0.5)%mod;  Db=(ll)(A[i].y+0.5)%mod;Dc=(ll)(B[i].x+0.5)%mod;  Dd=(ll)(B[i].y+0.5)%mod;c[i]=(Da*base*base+(Db+Dc)*base+Dd)%mod+mod; upd(c[i]);}
}
void getinv(int n,int *a,int *b)
{if(n==1){b[0]=pw(a[0],mod-2);return;}getinv(n+1>>1,a,b);mtt(n,a,b,tp);mtt(n,tp,b,tp);for(int i=0;i<n;i++)b[i]=((b[i]<<1)-tp[i])%mod+mod,upd(b[i]);
}
int main()
{base=sqrt(mod); I.x=1;while(1){memset(a,0,sizeof a);memset(b,0,sizeof b);n=rdn(); if(!n)return 0;for(int i=1;i<=n;i++)a[i]=rdn();for(int i=1;i<=n;i++)a[i]=mod-a[i]%mod,upd(a[i]);a[0]++;getinv(n+1,a,b);printf("%d\n",b[n]);}return 0;
}

转载于:https://www.cnblogs.com/Narh/p/10056981.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/265321.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虚拟磁带库

虚拟磁带库(Virtual Tape Library&#xff0c;VTL)&#xff0c;是指以磁盘作为自身存储介质&#xff0c;并能仿真为物理磁带库的产品。简单的说&#xff0c;虚拟磁带库就是将磁盘空间虚拟为磁带空间&#xff0c;能够在传统的备份软件上实现和传统磁带库同样功能的产品。传统磁带…

w ndows7端口在哪里,win7电脑遇到端口被占用的情况该如何查看并将其关闭

Windows7操作系统的酷炫和强大已经深受用户们的喜欢了&#xff0c;这里根大家分享的是教你查看win7电脑端口是否被占用的技巧&#xff0c;端口是我们在进行远程或者打印机等都会遇到的&#xff0c;但是有很多用户会遇到端口被占用的情况&#xff0c;遇到这样的问题首先就要找出…

STM32F103五分钟入门系列(十三)独立看门狗IWDG

参考&#xff1a;STM32F103五分钟入门系列&#xff08;十三&#xff09;独立看门狗IWDG 作者&#xff1a;自信且爱笑‘ 发布时间&#xff1a;2021-07-31 19:50:28 网址&#xff1a;https://blog.csdn.net/Curnane0_0/article/details/119269391?utm_sourceapp&app_version…

session-cookie 和token登录验证

最近研究了下基于token的身份验证&#xff0c;并将这种机制整合在个人项目中。现在很多网站的认证方式都从传统的seesioncookie转向token校验。对比传统的校验方式&#xff0c;token确实有更好的扩展性与安全性。    传统的sessioncookie身份验证    由于HTTP是无状态的…

高效使用Bitmaps(一) 大Bitmap的加载

转自&#xff1a;http://my.oschina.net/rengwuxian/blog/182885 高效使用Bitmaps有什么好处&#xff1f; 我 们常常提到的“Android程序优化”&#xff0c;通常指的是性能和内存的优化&#xff0c;即&#xff1a;更快的响应速度&#xff0c;更低的内存占用。Android程序的性能…

android自动软键盘,Android自定义软键盘

MyKeyboardAndroid自定义键盘的使用实现步骤第一步&#xff1a;1、新建一个xml文件夹放在res目录下面&#xff0c;然后新建xml文件:money_keyboard.xml2、然后在XML文件中添加按钮布局&#xff0c;这个布局就是键盘的样子了android:horizontalGap"1dp"android:keyWid…

433M射频遥控灯、震动感应灯、WIFI避障小车

目录 433M射频遥控灯1. 433M射频灯的硬件连接2. 具体接线剖析3.课堂干货简述4. 准备工作之环境搭建KEIL_ISP_USBTOTTL驱动5. KEIL建立工程6.电子可编程开关继电器的原理7. 上电灯亮代码编写8. 烧写程序到单片机,实现灯一亮一灭9.遥控灯编程实现及效果验证震动感应灯1. 入门项目…

Bootstrap使用-1

目录 结构&#xff1a;1. 视图函数2. 模板3. 登陆4. 怎样发生的添加模板基础模板提供的block定制基础模板结构&#xff1a; $ tree -I "__pycache*|*.pyc|*.xlsx" -FCL 3 . |-- templates/ | -- h1.html -- test-boostracp.py 1. 视图函数 test-boostracp.py from …

测试 SyntaxHighlighter

#include <stdio.h>int main() {return 0; }转载于:https://www.cnblogs.com/gongnaixiao/p/3472817.html

段错误、内存溢出、内存泄漏(区别)、堆溢出、栈溢出

参考&#xff1a;内存泄漏、内存溢出、段错误、堆溢出、栈溢出 作者&#xff1a;焦木白 发布时间&#xff1a;2019-10-22 网址&#xff1a;https://blog.csdn.net/jiaomubai/article/details/102680705?spm1001.2014.3001.5501 目录段错误内存溢出内存泄漏栈溢出堆溢出段错误 …

12.2号

今日活动&#xff1a;继续改善软件时间&#xff1a;10.00-11.00地点&#xff1a;自习室 转载于:https://www.cnblogs.com/xinyue6/p/10072515.html

表单文本框提示字符点击时清空

表单文本框提示字符点击时清空&#xff08;input标签onfocus时文本框内提示信息清空&#xff09; 作用是&#xff0c;一个文本框&#xff0c;需要输入内容&#xff0c;在没有输入的时候里面有一段提示内容&#xff0c;当点击这个文本框输入的时候&#xff0c;文本框内的内容自…

C语言中指针的地址和内容

参考&#xff1a;C语言中指针的地址和内容 作者&#xff1a;wallying 发布时间&#xff1a;2018-10-18 09:47:54 网址&#xff1a;https://blog.csdn.net/qq_36631580/article/details/89375140?spm1001.2014.3001.5502 #include <stdio.h>//一般用"地址"表示…

android运行过程简书,android 启动过程(一)

1、由init.rc调用 app_main.cpp的main方法&#xff0c;启动zygote进程3、调用AndroidRuntime.cpp 的start方法传递ZygoteInit类路径5、AndroidRuntime.cpp的start方法主要启动java虚拟机跟注册虚拟机&#xff0c;调用ZygoteInit的main方法6、ZygoteInit的main方法主要 把zygote…

鼠标事件

<!DOCTYPE html><html lang"en"><head><meta charset"UTF-8"><title>mouse 事件</title><script type"text/javascript" src" ./js/jquery.min.js"></script><script type"t…

将会改变未来IT世界的十种编程语言

这里要说的都是革新&#xff0c;说这些的目的就是要保持关注最新技术。如果你是一个程序员&#xff0c;想要探寻未来技术&#xff0c;那这篇文章就是你的必读之选。我们这里列出了10种编程语言&#xff0c;10种将会改变IT世界工作方式的编程语言。这些语言已经在开始改变IT界的…

回调函数 —— 借助中间通用函数(形参里有函数指针,实现函数注册)调用不同的回调函数 (多态/分层)

回调函数传参&#xff1a;函数指针做函数参数&#xff08;回调函数&#xff09; 目录背景回调函数是实现函数分层且单向依赖的好办法&#xff0c;使用函数指针运行struct结构体回调函数代码更清晰简单理解回调函数Demo其他回调函数博文背景 这是我在实际工作中遇到的问题&…

linux下用户操作

在linux中添加ftp用&#xff0c;并设置相应的权限&#xff0c;操作步骤如下&#xff1a; 1、环境&#xff1a;ftp为vsftp。被限制用户名为test。被限制路径为/home/test。 2、建用户&#xff1a;在root用户下&#xff1a; useradd -d /home/test test //增加用户test&#…

Venkat 演讲翻译:你要清除代码中的异味

今天&#xff0c;Venkat Subramaniam 就关于清除代码异味的话题给我们做了一个非常有趣的演讲。下面就是我记录的一些他的话。 为什么我们需要有质量的代码&#xff1f; 敏捷开发方法是用来应付那些要求代码做大量改动的反馈信息的方法。如果程序没有用一种好的表达方式来表现&…

ESP8266等模块

模块讲解学习视频可参照&#xff1a;https://space.bilibili.com/323745961?spm_id_from333.788.b_765f7570696e666f.1 作者&#xff1a;叁议电子 目录ESP8266 WIFI模块介绍电脑操作ESP8266单片机上网ESP8266 WIFI模块介绍 电脑操作ESP8266 单片机上网