[LOJ2271] [SDOI2017] 遗忘的集合
题目链接
LOJ:https://loj.ac/problem/2271
洛谷:https://www.luogu.org/problemnew/show/P3784
BZOJ太伤身体死活卡不过还是算了吧...
Solution
为啥窝洛谷\(rk4\) \(\rm BZOJ\)死活跑不过啊...
技不如人,肝败吓疯...
题目并不难
设\(a_i\)表示\(i\)有没有出现在集合中,这是我们要求的答案。
那么把背包写成生成函数就是:
\]
两边取对数:
\]
注意到:
\]
把上面那个分式化一下就是:
\]
带一下:
\]
我们枚举\(ij\):
\sum_{T=1}^{+\infty}x^T\sum_{i|T}a_i\cdot i=T\cdot \ln F(x)
\]
注意到左边是一个莫反的形式,我们对\(F(x)\)求\(\ln\),然后把系数搞出来,在套莫反公式就好了。
复杂度\(O(n\log n)\)。
#include<bits/stdc++.h>
using namespace std;
void read(int &x) {
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-f;
for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';x*=f;
}
void print(int x) {
if(x<0) putchar('-'),x=-x;
if(!x) return ;print(x/10),putchar(x%10+48);
}
void write(int x) {if(!x) putchar('0');else print(x);putchar('\n');}
#define lf double
#define ll long long
#define pii pair<int,int >
#define vec vector<int >
#define pb push_back
#define mp make_pair
#define fr first
#define sc second
const int maxn = 6e5+10;
const int inf = 1e9;
const lf eps = 1e-8;
const lf pi = acos(-1);
const int all = (1<<15)-1;
struct cp {
lf r,i;
cp () {}
cp (lf _r,lf _i) {r=_r,i=_i;}
cp operator + (const cp &rhs) const {return cp(r+rhs.r,i+rhs.i);}
cp operator - (const cp &rhs) const {return cp(r-rhs.r,i-rhs.i);}
cp operator * (const cp &rhs) const {return cp(r*rhs.r-i*rhs.i,i*rhs.r+r*rhs.i);}
cp operator / (const int &rhs) const {return cp(r/(lf)rhs,i/(lf)rhs);}
void print() {printf("%lf %lf\n",r,i);}
}w[maxn],g[5][maxn];
cp conj(cp x) {return cp(x.r,-x.i);}
int n,m,N,bit,mxn,mod;
int pos[maxn],a[maxn],b[maxn],c[maxn],inv[maxn],f[maxn],h[maxn];
void fft(cp *r) {
for(int i=1;i<N;i++) if(pos[i]>i) swap(r[i],r[pos[i]]);
for(int i=1,d=mxn>>1;i<N;i<<=1,d>>=1)
for(int j=0;j<N;j+=i<<1)
for(int k=0;k<i;k++) {
cp x=r[j+k],y=w[k*d]*r[i+j+k];
r[j+k]=x+y,r[i+j+k]=x-y;
}
}
void ntt_get(int len) {
for(N=1,bit=0;N<=len;N<<=1,bit++);
for(int i=1;i<N;i++) pos[i]=pos[i>>1]>>1|((i&1)<<(bit-1));
}
void poly_mul(int *r,int *s,int *t,int len) {
ntt_get(len);
for(int i=0;i<len;i++) g[0][i]=cp(r[i]&all,r[i]>>15),g[1][i]=cp(s[i]&all,s[i]>>15);
for(int i=len;i<N;i++) g[0][i]=g[1][i]=cp(0,0);
fft(g[0]),fft(g[1]);
for(int i=0;i<N;i++) {
int j=(N-i)&(N-1);
g[2][j]=(g[0][i]+conj(g[0][j]))*cp(0.5,0)*g[1][i];
g[3][j]=(g[0][i]-conj(g[0][j]))*cp(0,-0.5)*g[1][i];
}fft(g[2]),fft(g[3]);
for(int i=0;i<N;i++) g[2][i]=g[2][i]/N,g[3][i]=g[3][i]/N;
for(int i=0;i<N;i++) {
ll pp=g[2][i].r+0.5,x=g[2][i].i+0.5,y=g[3][i].r+0.5,z=g[3][i].i+0.5;
t[i]=((pp%mod+(((x+y)%mod)<<15)+((z%mod)<<30))%mod+mod)%mod;
}
}
int add(int x,int y) {return x+y>mod?x+y-mod:x+y;}
int del(int x,int y) {return x-y<0?x-y+mod:x-y;}
int mul(int x,int y) {return 1ll*x*y-1ll*x*y/mod*mod;}
int tmp[10][maxn];
int qpow(int aa,int x) {
int res=1;
for(;x;x>>=1,aa=mul(aa,aa)) if(x&1) res=mul(res,aa);
return res;
}
void poly_inv(int *r,int *t,int len) {
if(len==1) return t[0]=qpow(r[0],mod-2),void();
poly_inv(r,t,len>>1);ntt_get(len);
poly_mul(t,r,tmp[2],len);
poly_mul(tmp[2],t,tmp[3],len);
for(int i=0;i<len;i++) t[i]=del(add(t[i],t[i]),tmp[3][i]);
}
void poly_der(int *r,int *t,int len) {
ntt_get(len);
for(int i=1;i<len;i++) t[i-1]=mul(i,r[i]);
for(int i=len-1;i<N;i++) t[i]=0;
}
void poly_int(int *r,int *t,int len) {
ntt_get(len);
for(int i=0;i<len;i++) t[i+1]=mul(inv[i+1],r[i]);t[0]=0;
for(int i=len+1;i<N;i++) t[i]=0;
}
void poly_ln(int *r,int *t,int len) {
poly_der(r,tmp[4],len);
poly_inv(r,tmp[5],len);
poly_mul(tmp[4],tmp[5],tmp[6],len);
poly_int(tmp[6],t,len);
}
int pri[maxn],tot,mu[maxn],A[maxn],vis[maxn];
void sieve() {
mu[1]=1;
for(int i=2;i<=mxn;i++) {
if(!vis[i]) mu[i]=-1,pri[++tot]=i;
for(int j=1;j<=tot&&i*pri[j]<=mxn;j++) {
vis[i*pri[j]]=1;
if(i%pri[j]==0) break;
mu[i*pri[j]]=-mu[i];
}
}
}
int main() {
read(n),read(mod);ntt_get(n<<1);inv[0]=inv[1]=1;
for(mxn=1;mxn<N;mxn<<=1);
for(int i=0;i<=mxn;i++) w[i]=cp(cos(2.0*pi*i/mxn),sin(2.0*pi*i/mxn));
for(int i=2;i<N;i++) inv[i]=mul(mod-mod/i,inv[mod%i]);
for(int i=1;i<=n;i++) read(f[i]);f[0]=1;
poly_ln(f,h,N>>1);sieve();
for(int i=1;i<=n;i++) h[i]=mul(h[i],i);
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j+=i)
A[j]+=h[j/i]*mu[i];
int ans=0;
for(int i=1;i<=n;i++) if(A[i]) ans++;
write(ans);
for(int i=1;i<=n;i++) if(A[i]) printf("%d ",i);puts("");
return 0;
}
[LOJ2271] [SDOI2017] 遗忘的集合的更多相关文章
- [SDOI2017]遗忘的集合
[SDOI2017]遗忘的集合 综合了很多套路的题 一看就是完全背包 生成函数! 转化为连乘积形式 Pi....=F 求Ln! 降次才可以解方程 发现方程是: f[i]=∑t|i : bool(t)* ...
- 洛谷P3784 [SDOI2017]遗忘的集合(生成函数)
题面 传送门 题解 生成函数这厮到底还有什么是办不到的-- 首先对于一个数\(i\),如果存在的话可以取无限多次,那么它的生成函数为\[\sum_{j=0}^{\infty}x^{ij}={1\ove ...
- [题解] LuoguP3784 [SDOI2017]遗忘的集合
要mtt的题都是...... 多补了几项就被卡了一整页......果然还是太菜了...... 不说了......来看100分的做法吧...... 如果做过付公主的背包,前面几步应该不难想,所以我们再来 ...
- [BZOJ4913][SDOI2017]遗忘的集合
题解: 首先先弄出$f(x)$的生成函数$$f(x)=\prod_{i=1}^{n} {{(\frac{1}{1-x^i})}}^{a[i]}$$因为$f(x)$已知,我们考虑利用这个式子取推出$a[ ...
- P3784 [SDOI2017]遗忘的集合
非常神仙的一道题! 题意:给出某n个数字跑完全背包m容量的dp数组,求满足要求的字典序最小的n个元素,不知道n是多少. 首先考虑付公主的背包这个题. 对dp数组求一个ln,设它为F. 已知 e^(G1 ...
- 洛谷 3784(bzoj 4913) [SDOI2017]遗忘的集合——多项式求ln+MTT
题目:https://www.luogu.org/problemnew/show/P3784 https://www.lydsy.com/JudgeOnline/problem.php?id=4913 ...
- SDOI2017遗忘的集合
题面链接 咕咕咕 题外话 为了这道题我敲了\(MTT\).多项式求逆.多项式\(ln\)等模板,搞了将近一天. sol 最近懒得写题解啊,随便搞搞吧. 看到这个就是生成函数套上去. \[F(x)=\p ...
- BZOJ 4913 [Sdoi2017] 遗忘的集合
骂了隔壁的 BZOJ垃圾评测机 我他妈卡了两页的常数了 我们机房的电脑跑的都比BZOJ快
- 【SDOI2017】遗忘的集合
题目描述 好神仙啊,我还真的以为这是个构造题,结果是有唯一解的. 设答案为多项式\(a,a_i\in\{0,1\}\). 则: \[ f(x)=\Pi (\frac{1}{1-x^i})^{a_i} ...
随机推荐
- Linux入门基础(六):Linux系统启动
系统启动流程 BIOS MBR : Boot Code 执行引导程序-GRUB 加载内核 执行init runlevel BIOS BIOS(basic input output system),我们 ...
- 在python脚本中设置环境变量,并运行相关应用
1. 问题 在自动化应用的时候 ,有时候环境变量与运行需要不一致.这时候有两种选择: 改变节点环境变量,使得其和运行需求保持一致: 在自动化脚本中设置环境变量,其范围只在脚本运行环境中有效. 显然,当 ...
- L2 Helios OPcodez
天堂2 Helios太阳神版本 的客户端和服务端封包 *********************** Client ***********************00 SendLogOut01 Req ...
- 【python 2.7】输入任意字母数字,输出其对应的莫尔斯码并播放声音
#python 2.7 #!/usr/bin/env python # -*- coding:utf-8 -*- import os import winsound,sys,time __author ...
- Android工程导入Unity3D(避坑版)
最近与各种牛逼的项目管理软件打交道,比如SourceTree,要看英文版的才看得懂,中文反而不会用!... 这篇博客适合没怎么接触过安卓的小伙伴们,网上也有很多相关的教程,但是大多都没有具体的操作或则 ...
- CentOS 7 Docker基本特性
Docker是一个开源的应用容器引擎,开发人员可以非常容易地打包已经开发好的应用,同时将应用相关的依赖包也打包到这样一个可移植的容器中,然后发布到任意的Linux主机系统上.Docker是基于Linu ...
- roadhog中如何拷贝文件
一:使用 public 目录 我们约定 public 目录下的文件会在 server 和 build 时被自动 copy 到输出目录(默认是 ./dist)下.所以可以在这里存放 favicon, i ...
- Beta版本互评
基于NABCD评论作品,及改进建议 经过alpha发布之后,迫不及待的使用了psp daily这款软件,使用非常方便,基本的功能都可以实现,经过beta周之后,我对这款产品非常期待,希望能给我更友好的 ...
- 实验三— —敏捷开发与XP实践
---恢复内容开始--- java的第二个实验——JAVA面向对象程序设计 北京电子科技学院 实 验 报 告 课程:Java程序设计 班级:1352 姓名:林涵锦 学号:2013 ...
- eclipse异常关闭,而Tomcat然在运行解决方法
1.eclipse异常关闭,而Tomcat然在运行,再启动tomcat会出现端口冲突 解决方法:打开任务管理器,找到javaw.exe,点击关闭,就可以了