HDU 5730 Shell Necklace(生成函数 多项式求逆)

Shell Necklace

由题意可得f[n]=∑i=1na[i]f[n−i]f[n] = \sum\limits_{i = 1} ^{n} a[i] f[n - i]f[n]=i=1na[i]f[ni],设f[n]f[n]f[n]的生成函数为F(x)F(x)F(x)a[n]a[n]a[n]的生成函数为A(n)A(n)A(n)
F(x)A(x)=∑n≥0xn∑i+j=naifn−i由于a0=0,a0f0=0,右侧卷积缺了f0这一项F(x)A(x)=F(x)−f0F(x)=11−A(x)多项式求个逆就好了F(x)A(x) = \sum_{n \geq 0} x ^ n \sum_{i + j = n} a_if_{n - i}\\ 由于a_0 = 0,a_0 f_0 = 0,右侧卷积缺了f_0这一项\\ F(x) A(x) = F(x) - f_0\\ F(x) = \frac{1}{1 - A(x)}\\ 多项式求个逆就好了\\ F(x)A(x)=n0xni+j=naifnia0=0a0f0=0f0F(x)A(x)=F(x)f0F(x)=1A(x)1

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
#define ll long long
#define ull unsigned long long
#define RG register
#define MAX 288888
#define MOD (313)
const double Pi=acos(-1);
const int m=sqrt(MOD);
inline int read()
{RG int x=0,t=1;RG char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-')t=-1,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();return x*t;
}
int fpow(int a,int b){int s=1;while(b){if(b&1)s=1ll*s*a%MOD;a=1ll*a*a%MOD;b>>=1;}return s;}
struct Complex{double a,b;}W[MAX],A[MAX],B[MAX],C[MAX],D[MAX];
Complex operator+(Complex a,Complex b){return (Complex){a.a+b.a,a.b+b.b};}
Complex operator-(Complex a,Complex b){return (Complex){a.a-b.a,a.b-b.b};}
Complex operator*(Complex a,Complex b){return (Complex){a.a*b.a-a.b*b.b,a.a*b.b+a.b*b.a};}
int r[MAX];
void FFT(Complex *P,int N,int opt)
{for(int i=0;i<N;++i)if(i<r[i])swap(P[i],P[r[i]]);for(int i=1;i<N;i<<=1)for(int p=i<<1,j=0;j<N;j+=p)for(int k=0;k<i;++k){Complex w=(Complex){W[N/i*k].a,W[N/i*k].b*opt};Complex X=P[j+k],Y=P[i+j+k]*w;P[j+k]=X+Y;P[i+j+k]=X-Y;}if(opt==-1)for(int i=0;i<N;++i)P[i].a/=1.0*N;
}
void Multi(int *a,int *b,int len,int *ret)
{for(int i=0;i<(len<<1);++i)A[i]=B[i]=C[i]=D[i]=(Complex){0,0};for(int i=0;i<len;++i){a[i]%=MOD;b[i]%=MOD;A[i]=(Complex){(a[i]/m)*1.0,0};B[i]=(Complex){(a[i]%m)*1.0,0};C[i]=(Complex){(b[i]/m)*1.0,0};D[i]=(Complex){(b[i]%m)*1.0,0};}int N,l=0;for(N=1;N<=len;N<<=1)++l;for(int i=0;i<N;++i)r[i]=(r[i>>1]>>1)|((i&1)<<(l-1));for(int i=1;i<N;i<<=1)for(int k=0;k<i;++k)W[N/i*k]=(Complex){cos(k*Pi/i),sin(k*Pi/i)};FFT(A,N,1);FFT(B,N,1);FFT(C,N,1);FFT(D,N,1);for(int i=0;i<N;++i){Complex tmp=A[i]*C[i];C[i]=B[i]*C[i],B[i]=B[i]*D[i],D[i]=D[i]*A[i];A[i]=tmp;C[i]=C[i]+D[i];}FFT(A,N,-1);FFT(B,N,-1);FFT(C,N,-1);for(int i=0;i<len;++i){ret[i]=0;ret[i]=(ret[i]+1ll*(ll)(A[i].a+0.5)%MOD*m%MOD*m%MOD)%MOD;ret[i]=(ret[i]+1ll*(ll)(C[i].a+0.5)%MOD*m%MOD)%MOD;ret[i]=(ret[i]+1ll*(ll)(B[i].a+0.5)%MOD)%MOD;ret[i]=(ret[i]+MOD)%MOD;}
}
int c[MAX],d[MAX];
void Inv(int *a,int *b,int len)
{if(len==1){b[0]=fpow(a[0],MOD-2);return;}Inv(a,b,len>>1);Multi(a,b,len,c);Multi(c,b,len,d);for(int i=0;i<len;++i)b[i]=(b[i]+b[i])%MOD;for(int i=0;i<len;++i)b[i]=(b[i]+MOD-d[i])%MOD;
}
int n,a[MAX],b[MAX];
int main()
{while(n=read()){for(int i=1;i<=n;++i)a[i]=read()%MOD;for(int i=1;i<=n;++i)a[i]=(MOD-a[i])%MOD;a[0]++;int N;for(N=1;N<=n;N<<=1);Inv(a,b,N);printf("%d\n",b[n]);memset(a,0,sizeof(a));memset(b,0,sizeof(b));}return 0;
}

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

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

相关文章

.NET Core 收徒,有缘者,可破瓶颈

最近感悟天命&#xff0c;偶有所得&#xff0c;故而打算收徒若干&#xff0c;以继吾之传承。有缘者&#xff0c;可破瓶颈&#xff0c;职场巅峰指日可待。入门基本要求&#xff1a;1、工作经验&#xff1a;1年或以上。2、拜师费用&#xff1a;3999元&#xff08;RMB&#xff09;…

【全】Docker(二)-在Docker中部署Nginx实现负载均衡视频教程

一、前言在前面的文章中我们已经介绍了如何在Centos7系统中安装Docker以及利用Docker进行Asp.Net Core应用的部署。在本文中&#xff0c;我们将继续介绍利用Docker部署Nginx服务实现负载均衡。文章最后附有Nginx部署的视频全过程。注&#xff1a;查看公众号历史文章&#xff0c…

P2012 拯救世界2(指数型生成函数)

P2012 拯救世界2 三种基因&#xff0c;我们分别列出其生成函数&#xff1a; F(x)∑n≥0xnn!exG(x)∑n≥0x2n1(2n1)!12(∑n≥0xnn!−∑n≥0(−1)nxnn!)12(ex−e−x)H(x)∑n≥0x2n(2n)!12(∑n≥0xnn!∑n≥0(−1)nxnn!)12(exe−x)F(x) \sum_{n \geq 0} \frac{x ^ n}{n!} e ^ x\…

开源导入导出通用库Magicodes.ExporterAndImporter发布

导入导出通用库 Magicodes.ExporterAndImporter为心莱团队封装的导入导出通用库&#xff0c;并且仍在跟随项目不断地打磨。GitHub地址&#xff1a;https://github.com/xin-lai/Magicodes.ExporterAndImporter目录特点相关官方Nuget包导出 Demo普通导出特性导出列头处理或者多语…

第一个错误的版本

题目描述 你是产品经理&#xff0c;目前正在带领一个团队开发新的产品。不幸的是&#xff0c;你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的&#xff0c;所以错误的版本之后的所有版本都是错的。 假设你有 n 个版本 [1, 2, …, n]&#xff0c;你…

P4705 玩游戏(生成函数,多项式ln)

P4705 玩游戏 有ansk∑i1n∑j1m(aibj)knm先舍弃nm不管ansk∑r0k∑i1n∑j1mCkrairbjk−r∑r0k∑i1n∑j1mk!r!(k−r)!airbjk−rk!∑r0k(1r!∑i1nair)(1(k−r)!∑j1mbjk−r)不难发现这就是一个卷积的形式了&#xff0c;但是我们现在还不知道∑i1nair,∑i1mbir,(r∈[0,k])设A(x)为∑…

爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢&#xff1f; 注意&#xff1a;给定 n 是一个正整数。 示例 1&#xff1a; 输入&#xff1a; 2 输出&#xff1a; 2 解释&#xff1a; 有两种方法可以爬到楼顶…

netcore 中的动态代理与RPC实现(微服务专题)

一、关于RPC的调用1. 调用者&#xff08;客户端Client&#xff09;以本地调用的方式发起调用&#xff1b;  2. Client stub&#xff08;客户端存根&#xff09;收到调用后&#xff0c;负责将被调用的方法名、参数等打包编码成特定格式的能进行网络传输的消息体&#xff1b; …

多项式除法,多项式取模

多项式除法 给定一个nnn次多项式F(x)F(x)F(x)和mmm次多项式G(x)G(x)G(x)&#xff0c;要求R(x),Q(x)R(x), Q(x)R(x),Q(x)&#xff0c;满足F(x)R(x)G(x)Q(x)F(x) R(x)G(x) Q(x)F(x)R(x)G(x)Q(x)。 R(x)R(x)R(x)是一个n−mn - mn−m阶多项式&#xff0c;Q(x)Q(x)Q(x)是一个小于…

[翻译] .NET Core 3.0 Preview 9 发布

原文: Announcing .NET Core 3.0 Preview 9今天&#xff0c;我们宣布推出 .NET Core 3.0 Preview 9。就像 Preview 8 一样&#xff0c;我们专注于打磨 .NET Core 3.0 的最终版本&#xff0c;而不是添加新功能。如果这些最终版本看起来不像早期预览版那么令人兴奋&#xff0c;我…

南昌网络赛E Interesting Series

Interesting Series 可求得通项Fnan−1a−1F_n \frac{a ^ n - 1}{a - 1}Fn​a−1an−1​&#xff0c;一个等比数列的前nnn项和&#xff0c;value(s)Fsum(s)value(s) F_{sum(s)}value(s)Fsum(s)​。 题目要我们求的是Answer(K)∑s∈subsetofSand∣s∣Kvalue(s)Answer(K) \s…

谈谈“学习”这件事儿

曾经有童鞋在我博客留言&#xff1a;楼主你是如何学习的&#xff0c;肿么那么牛逼&#xff08;注&#xff1a;真不牛逼&#xff0c;只不过我讲的你刚好不知道&#xff0c;在你心中就形成了好牛逼的样子&#xff09;曾经也有童鞋加我好友&#xff0c;开头第一句则是&#xff1a;…

牛客练习赛50 F tokitsukaze and Another Protoss and Zerg

tokitsukaze and Another Protoss and Zerg 考虑生成函数&#xff0c;每一场的生成函数为∑j1b[i]Cb[i]j∑j1a[i]Ca[i]jxj\sum\limits_{j 1} ^{b[i]}C_{b[i]} ^ j \sum\limits_{j 1} ^{a[i]}C_{a[i]} ^{j} x ^ jj1∑b[i]​Cb[i]j​j1∑a[i]​Ca[i]j​xj&#xff0c; 进一步…

持续集成之应用k8s自动部署

持续集成之应用k8s自动部署Intro上次我们提到了docker容器化及自动化部署[1]&#xff0c;这仅仅适合个人项目或者开发环境部署&#xff0c;如果要部署到生产环境&#xff0c;必然就需要考虑很多因素&#xff0c;比如访问量大了如何调整部署&#xff0c;如何更好的应对大并发的情…

Fizz Buzz

题目描述 写一个程序&#xff0c;输出从 1 到 n 数字的字符串表示。 如果 n 是3的倍数&#xff0c;输出“Fizz”&#xff1b; 如果 n 是5的倍数&#xff0c;输出“Buzz”&#xff1b; 3.如果 n 同时是3和5的倍数&#xff0c;输出 “FizzBuzz”。 示例&#xff1a; n 15,返…

多项式全家桶(半)

快速傅里叶变换(FFT) 多项式表示 系数表示法&#xff1a; 一个nnn次多项式可以用n1n 1n1个系数表示出来&#xff1a;f(x)a0a1xa2x2⋯an−1xn−1anxnf(x) a_0 a_1 x a_2 x ^ 2 \dots a_{n - 1} x ^{n- 1} a_n x ^nf(x)a0​a1​xa2​x2⋯an−1​xn−1an​xn。 点值表示…

持续集成之应用容器化及自动化部署

通过 Azure Pipelines 实现持续集成之docker容器化及自动化部署IntroAzure DevOps Pipeline 现在对于公开的项目完全免费&#xff0c;这对于开源项目来讲无疑是个巨大的好消息&#xff0c;在 Github 的 Marketplace 里有个 Azure Pipeline&#xff0c;就是微软的 Azure DevOps …

最小栈

题目描述 设计一个支持 push&#xff0c;pop&#xff0c;top 操作&#xff0c;并能在常数时间内检索到最小元素的栈。 push(x) – 将元素 x 推入栈中。 pop() – 删除栈顶的元素。 top() – 获取栈顶元素。 getMin() – 检索栈中的最小元素。 示例: MinStack minStack new …

持续集成之 Nuget 进阶

持续集成之 Nuget 进阶Intro之前介绍了一篇基于 Azure pipeline 的 nuget 包的持续集成配置&#xff0c;但是比较粗糙&#xff0c;这里介绍一下结合 Cake 实现更优雅的 nuget 包发布流程。实现目标&#xff1a;分支(除master/preview)有代码 push 或者 pr 时 自动 buildpreview…

#3771. Triple(生成函数 + 容斥)

#3771. Triple 考虑只有一个损失时&#xff0c;损失值的生成函数为A(x)A(x)A(x)。 如果不考虑无序方案&#xff0c;有两个损失的生成函数为B(x)A(x)A(x)B(x) A(x)A(x)B(x)A(x)A(x)&#xff0c;同理有三个的时候C(x)A(x)A(x)A(x)C(x) A(x)A(x)A(x)C(x)A(x)A(x)A(x)。 考虑如…