[BZOJ4913][SDOI2017]遗忘的集合
题解:
首先先弄出$f(x)$的生成函数
$$f(x)=\prod_{i=1}^{n} {{(\frac{1}{1-x^i})}}^{a[i]}$$
因为$f(x)$已知,我们考虑利用这个式子取推出$a[i]$
右边的乘法显然处理起来不方便,按照套路两边取对数
$$ln(f(x))=\sum_{i=1}^{n} {-a[i]*ln(1-x^i)}$$
然后看见$ln(1+x)$肯定是泰勒展开了,得到
$$ln(f(x))=\sum_{i=1}^{n} {-a[i]*\sum_{k=1}^{INF} {\frac{{(-1)}^{k-1}*{{{(-x^i)}^k}}}{k}}}$$
化简一下就是
$$ln(f(x))=\sum_{i=1}^{n} {a[i]*\sum_{k=1}^{INF} {\frac{{x^{ik}}}{k}}}$$
然后因为我们知道的$f(x)$的每一项,所以变成枚举x系数
令$T=ik$
$$ln(f(x))=\sum_{T=1}^{INF} {x^T \sum_{i|T}^{T}{\frac{i*a[i]}{T}}}$$
然后我们只需要从小到大枚举T,然后依旧算出每个$a[i]$并处理对之后的影响
常数太大只有50。。。不知道怎么卡
#include <bits/stdc++.h> using namespace std; #define rint register int #define IL inline #define rep(i,h,t) for (int i=h;i<=t;i++) #define dep(i,t,h) for (int i=t;i>=h;i--) #define me(x) memset(x,0,sizeof(x)) #define ll long long namespace IO{char ss[1<<24],*A=ss,*B=ss;IL char gc(){return A==B&&(B=(A=ss)+fread(ss,1,1<<24,stdin),A==B)?EOF:*A++;}template<class T>void read(T &x){rint f=1,c; while (c=gc(),c<48||c>57) if (c=='-') f=-1; x=(c^48);while (c=gc(),c>47&&c<58) x=(x<<3)+(x<<1)+(c^48); x*=f;}char sr[1<<24],z[20]; int C1=-1,Z;template<class T>void wer(T x){if (x<0) sr[++C1]='-',x=-x;while (z[++Z]=x%10+48,x/=10);while (sr[++C1]=z[Z],--Z);}IL void wer1(){sr[++C1]=' ';}IL void wer2(){sr[++C1]='\n';}template<class T>IL void maxa(T &x,T y) { if (x<y) x=y;}template<class T>IL void mina(T &x,T y) { if (x>y) x=y;}template<class T>IL void MAX(T x,T y){ return x>y?x:y;} template<class T>IL void MIN(T x,T y){ return x<y?x:y;} }; using namespace IO; const int N=3e5*4; const double ee=1.0000000000; const double pi=acos(-1.0); struct cp{double a,b;cp operator +(const cp o) const{return (cp){o.a+a,o.b+b};}cp operator -(const cp o) const{return (cp){a-o.a,b-o.b};}cp operator *(const cp o) const{return (cp){a*o.a-b*o.b,b*o.a+a*o.b};} }a[N],b[N],w[N]; int n,m,l,r[N],mo,mo2,mo3,x1[N],x2[N]; int fsp(int x,int y) {ll now=1;while (y){if (y&1) now=now*x%mo;y>>=1; x=1ll*x*x%mo;}return now; } void fft_init() {l=0; n=1; while (n<=m) n<<=1,l++;for (int i=0;i<n;i++) {w[i]=(cp){cos(pi*i/n),sin(pi*i/n)};r[i]=(r[i/2]/2)|((i&1)<<(l-1));} } void fft_clear() {rep(i,0,n-1) a[i].a=a[i].b=b[i].a=b[i].b=0; } void fft(cp *a,int o) {for (int i=0;i<n;i++) if (i>r[i]) swap(a[i],a[r[i]]);for (int i=1;i<n;i*=2)for (int j=0;j<n;j+=(i*2)){cp *x1=a+j,*x2=a+i+j;for (int k=0;k<i;k++,x1++,x2++){cp W=w[n/i*k]; W.b*=o;cp x=*x1,y=(*x2)*W;*x1=x+y,*x2=x-y;}}if (o==-1) rep(i,0,n-1) a[i].a/=n; } cp a1[N],a2[N],a3[N],b1[N],b2[N]; void getcj(int *A,int *B,int len) {m=2*len; fft_init();rep(i,0,len-1){ a1[i].a=A[i]/mo2,a2[i].a=A[i]%mo2;b1[i].a=B[i]/mo2,b2[i].a=B[i]%mo2;}fft(a1,1); fft(a2,1); fft(b1,1); fft(b2,1);rep(i,0,n-1){a3[i]=a1[i]*b1[i];a1[i]=a1[i]*b2[i]+a2[i]*b1[i];b2[i]=a2[i]*b2[i];}fft(a3,-1); fft(a1,-1); fft(b2,-1);rep(i,0,len-1){ B[i]=((ll)(a3[i].a+0.5)%mo*mo3+(ll)(a1[i].a+0.5)%mo*mo2+(ll)(b2[i].a+0.5))%mo; B[i]=(B[i]+mo)%mo;}rep(i,0,n){a1[i].a=a1[i].b=a2[i].a=a2[i].b=a3[i].a=a3[i].b=0;b1[i].a=b1[i].b=b2[i].a=b2[i].b=0;} } int C[N]; IL void getinv(int *A,int *B,int len) {if (len==1) {B[0]=fsp(A[0],mo-2); return;}getinv(A,B,(len+1)>>1);rep(i,0,len-1) C[i]=A[i];getcj(B,C,len); getcj(B,C,len);rep(i,0,len-1) B[i]=((2ll*B[i]-C[i])%mo+mo)%mo; } IL void getdao(int *A,int *B,int len) {for (int i=0;i<len-1;i++)B[i]=1ll*A[i+1]*(i+1)%mo;B[len-1]=0; } IL void getjf(int *A,int *B,int len) {for (int i=1;i<len;i++)B[i]=1ll*A[i-1]*fsp(i,mo-2)%mo;B[0]=0; } int C[N],D[N]; IL void getln(int *A,int *B,int len) {getdao(A,C,len);getinv(A,D,len);getcj(C,D,len);getjf(D,B,len); } void getexp(int *A,int *B,int len) {if (len==1) {B[0]=1; return;}getexp(A,B,(len+1)>>1);getln(B,C,len);rep(i,0,len-1) C[i]=((-C[i]+A[i])%mo+mo)%mo;C[0]=(C[0]+1)%mo;getcj(C,B,len); } int main() {freopen("1.in","r",stdin);freopen("1.out","w",stdout);int n1;read(n1); read(mo); mo2=3e4; mo3=mo2*mo2;x1[0]=1;rep(i,1,n1) read(x1[i]);getln(x1,x2,n1+1);rep(i,1,n1){for (int j=2;j*i<=n1;j++)x2[i*j]=(x2[i*j]-1ll*x2[i]*fsp(j,mo-2))%mo;}int cnt=0;rep(i,1,n1) if (x2[i]) cnt++;wer(cnt); wer2();rep(i,1,n1) if (x2[i]) wer(i),wer1();wer2();fwrite(sr,1,C1+1,stdout); return 0; }
#updata 12.14
使用我优秀的常数的新模板他就过了
#include <bits/stdc++.h> using namespace std; #define rint register int #define IL inline #define rep(i,h,t) for (int i=h;i<=t;i++) #define dep(i,t,h) for (int i=t;i>=h;i--) #define me(x) memset(x,0,sizeof(x)) #define ll long long namespace IO{char ss[1<<24],*A=ss,*B=ss;IL char gc(){return A==B&&(B=(A=ss)+fread(ss,1,1<<24,stdin),A==B)?EOF:*A++;}template<class T>void read(T &x){rint f=1,c; while (c=gc(),c<48||c>57) if (c=='-') f=-1; x=(c^48);while (c=gc(),c>47&&c<58) x=(x<<3)+(x<<1)+(c^48); x*=f;}char sr[1<<24],z[20]; int C1=-1,Z;template<class T>void wer(T x){if (x<0) sr[++C1]='-',x=-x;while (z[++Z]=x%10+48,x/=10);while (sr[++C1]=z[Z],--Z);}IL void wer1(){sr[++C1]=' ';}IL void wer2(){sr[++C1]='\n';}template<class T>IL void maxa(T &x,T y) { if (x<y) x=y;}template<class T>IL void mina(T &x,T y) { if (x>y) x=y;}template<class T>IL void MAX(T x,T y){ return x>y?x:y;} template<class T>IL void MIN(T x,T y){ return x<y?x:y;} }; using namespace IO; const int N=3e5*4; const double ee=1.0000000000; const double pi=acos(-1.0); struct cp{double a,b;cp operator +(const cp o) const{return (cp){o.a+a,o.b+b};}cp operator -(const cp o) const{return (cp){a-o.a,b-o.b};}cp operator *(const cp o) const{return (cp){a*o.a-b*o.b,b*o.a+a*o.b};} }a[N],b[N],c[N],d[N]; int n,m,l,r[N],mo,x1[N],x2[N]; IL int fsp(int x,int y) {ll now=1;while (y){if (y&1) now=now*x%mo;x=1ll*x*x%mo;y>>=1;}return now; } IL void clear() {for (int i=0;i<=n;i++) a[i].a=a[i].b=b[i].a=b[i].b=c[i].a=c[i].b=d[i].a=d[i].b=0; } cp *w[N],tmp[N*2]; int p; IL void init() {cp *now=tmp;for (int i=1;i<=p;i<<=1){w[i]=now;for (int j=0;j<i;j++) w[i][j]=(cp){cos(pi*j/i),sin(pi*j/i)};now+=i;} } IL void fft_init() {l=0; for (n=1;n<=m;n<<=1) l++;for (int i=0;i<n;i++) r[i]=(r[i/2]/2)|((i&1)<<(l-1)); } void fft(cp *a,int o) {for (int i=0;i<n;i++) if (i>r[i]) swap(a[i],a[r[i]]);for (int i=1;i<n;i<<=1)for (int j=0;j<n;j+=(i*2)){cp *x1=a+j,*x2=a+i+j,*W=w[i];for (int k=0;k<i;k++,x1++,x2++,W++){cp x=*x1,y=(cp){(*W).a,(*W).b*o}*(*x2); *x1=x+y,*x2=x-y;}}if (o==-1) for(int i=0;i<n;i++) a[i].a/=n; } IL void getcj(int *A,int *B,int len) {rep(i,0,len){A[i]=(A[i]+mo)%mo,B[i]=(B[i]+mo)%mo;}for (int i=0;i<len;i++){a[i]=(cp){A[i]&32767,A[i]>>15};b[i]=(cp){B[i]&32767,B[i]>>15};}m=len*2; fft_init();fft(a,1); fft(b,1);for (int i=0;i<n;i++){int j=(n-1)&(n-i);c[j]=(cp){0.5*(a[i].a+a[j].a),0.5*(a[i].b-a[j].b)}*b[i];d[j]=(cp){0.5*(a[i].b+a[j].b),0.5*(a[j].a-a[i].a)}*b[i];}fft(c,1); fft(d,1);double inv=ee/n;rep(i,0,n) c[i].a*=inv,c[i].b*=inv;rep(i,0,n) d[i].a*=inv,d[i].b*=inv;rep(i,0,len){ll a1=c[i].a+0.5,a2=c[i].b+0.5;ll a3=d[i].a+0.5,a4=d[i].b+0.5;B[i]=(a1+((a2+a3)%mo<<15)+((a4%mo)<<30))%mo;}clear(); } int C[N],D[N]; IL void getinv(int *A,int *B,int len) {if (len==1) {B[0]=fsp(A[0],mo-2); return;}getinv(A,B,(len+1)>>1);rep(i,0,len-1) C[i]=A[i];getcj(B,C,len); getcj(B,C,len);rep(i,0,len-1) B[i]=((2ll*B[i]-C[i])%mo+mo)%mo; } IL void getdao(int *A,int *B,int len) {for (int i=0;i<len-1;i++)B[i]=1ll*A[i+1]*(i+1)%mo;B[len-1]=0; } IL void getjf(int *A,int *B,int len) {for (int i=1;i<len;i++)B[i]=1ll*A[i-1]*fsp(i,mo-2)%mo;B[0]=0; } IL void getln(int *A,int *B,int len) {getdao(A,C,len);getinv(A,D,len);getcj(C,D,len);getjf(D,B,len); } void getexp(int *A,int *B,int len) {if (len==1) {B[0]=1; return;}getexp(A,B,(len+1)>>1);getln(B,C,len);rep(i,0,len-1) C[i]=((-C[i]+A[i])%mo+mo)%mo;C[0]=(C[0]+1)%mo;getcj(C,B,len); } int main() {freopen("10.in","r",stdin);freopen("1.out","w",stdout);int n1;read(n1); read(mo);x1[0]=1;rep(i,1,n1) read(x1[i]);p=(n1+1)<<1; init();getln(x1,x2,n1+1);rep(i,1,n1){for (int j=2;j*i<=n1;j++)x2[i*j]=(x2[i*j]-1ll*x2[i]*fsp(j,mo-2))%mo;}int cnt=0;rep(i,1,n1) if (x2[i]) cnt++;wer(cnt); wer2();rep(i,1,n1) if (x2[i]) wer(i),wer1();wer2();fwrite(sr,1,C1+1,stdout); return 0; }
转载于:https://www.cnblogs.com/yinwuxiao/p/10082817.html
[BZOJ4913][SDOI2017]遗忘的集合相关推荐
- [SDOI2017]遗忘的集合
题面 DP学得好好的为什么突然想起写多项式呢? 这要从几天前说起 一开始是看到一道FWT的DP([SNOI2017]遗失的答案) 然后在洛谷上搜 没有搜到 但是搜到了这个题 仔细一看 MTT+莫比乌斯 ...
- 洛谷 3784(bzoj 4913) [SDOI2017]遗忘的集合——多项式求ln+MTT
题目:https://www.luogu.org/problemnew/show/P3784 https://www.lydsy.com/JudgeOnline/problem.php?id=4913 ...
- 退役前的做题记录2.0
退役前的做题记录2.0 最近在刷省选题......大致上是按照省份刷的. 不过上面的题目顺序是按照写题的顺序排列的,所以可能会有点乱哈. [BZOJ2823][AHOI2012]信号塔 最小圆覆盖,随 ...
- 循环小数是分数集合吗_2020年部分CFA国外考场取消,通过率会受影响吗?
10月7日CFA institute发布最新消息:确定关闭37个12月CFA考试的城市考场! 由于这一批取消的全部是国外考场,国内考场目前都稳稳的,于是,就有CFA考生评论说:感觉竞争更激烈了考试没& ...
- 谷歌大脑科学家亲解 LSTM:一个关于“遗忘”与“记忆”的故事 本文作者:奕欣 2017-01-14 09:46 导语:AI科技评论保证这是相对通俗易懂的一篇入门介绍了,看不懂的话欢迎关注「AI 科技
谷歌大脑科学家亲解 LSTM:一个关于"遗忘"与"记忆"的故事 本文作者:奕欣 2017-01-14 09:46 导语:AI科技评论保证这是相对通俗易懂的一篇入 ...
- 谷歌大脑科学家亲解 LSTM:一个关于“遗忘”与“记忆”的故事
谷歌大脑科学家亲解 LSTM:一个关于"遗忘"与"记忆"的故事 本文作者:奕欣 2017-01-14 09:46 导语:AI科技评论保证这是相对通俗易懂的一篇入 ...
- DL之GRU:GRU算法相关论文、建立过程(基于TF)、相关思路配图集合、TF代码实现
DL之GRU:GRU算法相关论文.建立过程(基于TF).相关思路配图集合.TF代码实现 目录 GRU算法相关论文 GRU算法建立过程(基于TF) GRU算法的TF代码实现 GRU算法相关论文 GRU是 ...
- DL:深度学习算法(神经网络模型集合)概览之《THE NEURAL NETWORK ZOO》的中文解释和感悟(一)
DL:深度学习算法(神经网络模型集合)概览之<THE NEURAL NETWORK ZOO>的中文解释和感悟(一) 目录 THE NEURAL NETWORK ZOO perceptron ...
- 《MySQL必知必会》所有SQL语句图表集合(可作为查询表使用)---已完结
本篇文章是对<MySQL必知必会>所有语句知识点的图表集合,适合快速查询遗忘的SQL语句. 本文的脉络结构,首先先给出<MySQL必知必会>的目录和本书中用到的数据表的UML图 ...
最新文章
- ThinkSNS积分商城系统 一站式解决企业商城建站需求
- iOS----------苹果警告
- 一文深入浅出cv中的Attention机制
- 看设备指示灯识别网络故障
- 入门深度学习,其实并不难!
- python数据分析与展示 pdf课件_python数据分析与展示 课件 相关实例(示例源码)下载 - 好例子网...
- linux如何实现网络高级编程,嵌入式Linux网络编程之:网络高级编程-嵌入式系统-与非网...
- leetcode 106. 从中序与后序遍历序列构造二叉树 105. 从前序与中序遍历序列构造二叉树思考分析
- robot:当用例失败时执行关键字(发送短信)
- Java并发编程之AbstractQueuedSynchronizer(AQS)源码解析
- softmax的简洁实现
- Excel文件处理实战-Python编程进阶
- 珞珈一号影像辐射定标软件操作方法
- Aspose.word保存PDF时进行授权访问设置
- 南京银行网站连接不到服务器,南京银行网络准入控制平台
- 【qq机器人】机器人发美女图片
- 数据库系统原理学习笔记三(关系数据模型的组成要素)
- Learn OpenCV之Convex Hull
- 关于 NVIDIA 游戏内覆盖变成英文如何让其恢复中文
- 微信云托管常见问题FAQ(一)
热门文章
- 华为笔记本没有网线口_3599元起,华为台式机MateStation B515上架:R5 4600G
- matlab中lambertw,MATLAB解常微分方程
- java堆排序工具包_JAVA 排序工具类
- python1到100偶数求和_python1-100怎样偶数求和?_后端开发
- 高中计算机学ppt吗,高中信息技术人工智能教学培训课件选修5ppt
- 二分查找向上还是向下取整_113、股市中的跳空缺口判断技巧是向上还是向下
- openstack horizon dashboard_OpenStack最新版本:Ussuri发布亮点
- 系统学习数字图像处理之频域滤波
- 国产系统linux硬盘分区,Linux系统硬盘分区方案推荐
- 嵌入式系统——存储管理方案