[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[<<],*A=ss,*B=ss;
IL char gc()
{
return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;
}
template<class T>void read(T &x)
{
rint f=,c; while (c=gc(),c<||c>) if (c=='-') f=-; x=(c^);
while (c=gc(),c>&&c<) x=(x<<)+(x<<)+(c^); x*=f;
}
char sr[<<],z[]; int C1=-,Z;
template<class T>void wer(T x)
{
if (x<) sr[++C1]='-',x=-x;
while (z[++Z]=x%+,x/=);
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*;
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=;
while (y)
{
if (y&) now=now*x%mo;
y>>=; x=1ll*x*x%mo;
}
return now;
}
void fft_init()
{
l=; n=; while (n<=m) n<<=,l++;
for (int i=;i<n;i++)
{
w[i]=(cp){cos(pi*i/n),sin(pi*i/n)};
r[i]=(r[i/]/)|((i&)<<(l-));
}
}
void fft_clear()
{
rep(i,,n-) a[i].a=a[i].b=b[i].a=b[i].b=;
}
void fft(cp *a,int o)
{
for (int i=;i<n;i++) if (i>r[i]) swap(a[i],a[r[i]]);
for (int i=;i<n;i*=)
for (int j=;j<n;j+=(i*))
{
cp *x1=a+j,*x2=a+i+j;
for (int k=;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==-) rep(i,,n-) a[i].a/=n;
}
cp a1[N],a2[N],a3[N],b1[N],b2[N];
void getcj(int *A,int *B,int len)
{
m=*len; fft_init();
rep(i,,len-)
{
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,); fft(a2,); fft(b1,); fft(b2,);
rep(i,,n-)
{
a3[i]=a1[i]*b1[i];
a1[i]=a1[i]*b2[i]+a2[i]*b1[i];
b2[i]=a2[i]*b2[i];
}
fft(a3,-); fft(a1,-); fft(b2,-);
rep(i,,len-)
{
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,,n)
{
a1[i].a=a1[i].b=a2[i].a=a2[i].b=a3[i].a=a3[i].b=;
b1[i].a=b1[i].b=b2[i].a=b2[i].b=;
}
}
int C[N];
IL void getinv(int *A,int *B,int len)
{
if (len==) {B[]=fsp(A[],mo-); return;}
getinv(A,B,(len+)>>);
rep(i,,len-) C[i]=A[i];
getcj(B,C,len); getcj(B,C,len);
rep(i,,len-) B[i]=((2ll*B[i]-C[i])%mo+mo)%mo;
}
IL void getdao(int *A,int *B,int len)
{
for (int i=;i<len-;i++)
B[i]=1ll*A[i+]*(i+)%mo;
B[len-]=;
}
IL void getjf(int *A,int *B,int len)
{
for (int i=;i<len;i++)
B[i]=1ll*A[i-]*fsp(i,mo-)%mo;
B[]=;
}
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==) {B[]=; return;}
getexp(A,B,(len+)>>);
getln(B,C,len);
rep(i,,len-) C[i]=((-C[i]+A[i])%mo+mo)%mo;
C[]=(C[]+)%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[]=;
rep(i,,n1) read(x1[i]);
getln(x1,x2,n1+);
rep(i,,n1)
{
for (int j=;j*i<=n1;j++)
x2[i*j]=(x2[i*j]-1ll*x2[i]*fsp(j,mo-))%mo;
}
int cnt=;
rep(i,,n1) if (x2[i]) cnt++;
wer(cnt); wer2();
rep(i,,n1) if (x2[i]) wer(i),wer1();
wer2();
fwrite(sr,,C1+,stdout);
return ;
}
#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[<<],*A=ss,*B=ss;
IL char gc()
{
return A==B&&(B=(A=ss)+fread(ss,,<<,stdin),A==B)?EOF:*A++;
}
template<class T>void read(T &x)
{
rint f=,c; while (c=gc(),c<||c>) if (c=='-') f=-; x=(c^);
while (c=gc(),c>&&c<) x=(x<<)+(x<<)+(c^); x*=f;
}
char sr[<<],z[]; int C1=-,Z;
template<class T>void wer(T x)
{
if (x<) sr[++C1]='-',x=-x;
while (z[++Z]=x%+,x/=);
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*;
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=;
while (y)
{
if (y&) now=now*x%mo;
x=1ll*x*x%mo;
y>>=;
}
return now;
}
IL void clear()
{
for (int i=;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=;
}
cp *w[N],tmp[N*];
int p;
IL void init()
{
cp *now=tmp;
for (int i=;i<=p;i<<=)
{
w[i]=now;
for (int j=;j<i;j++) w[i][j]=(cp){cos(pi*j/i),sin(pi*j/i)};
now+=i;
}
}
IL void fft_init()
{
l=; for (n=;n<=m;n<<=) l++;
for (int i=;i<n;i++) r[i]=(r[i/]/)|((i&)<<(l-));
}
void fft(cp *a,int o)
{
for (int i=;i<n;i++) if (i>r[i]) swap(a[i],a[r[i]]);
for (int i=;i<n;i<<=)
for (int j=;j<n;j+=(i*))
{
cp *x1=a+j,*x2=a+i+j,*W=w[i];
for (int k=;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==-) for(int i=;i<n;i++) a[i].a/=n;
}
IL void getcj(int *A,int *B,int len)
{
rep(i,,len)
{
A[i]=(A[i]+mo)%mo,B[i]=(B[i]+mo)%mo;
}
for (int i=;i<len;i++)
{
a[i]=(cp){A[i]&,A[i]>>};
b[i]=(cp){B[i]&,B[i]>>};
}
m=len*; fft_init();
fft(a,); fft(b,);
for (int i=;i<n;i++)
{
int j=(n-)&(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,); fft(d,);
double inv=ee/n;
rep(i,,n) c[i].a*=inv,c[i].b*=inv;
rep(i,,n) d[i].a*=inv,d[i].b*=inv;
rep(i,,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<<)+((a4%mo)<<))%mo;
}
clear();
}
int C[N],D[N];
IL void getinv(int *A,int *B,int len)
{
if (len==) {B[]=fsp(A[],mo-); return;}
getinv(A,B,(len+)>>);
rep(i,,len-) C[i]=A[i];
getcj(B,C,len); getcj(B,C,len);
rep(i,,len-) B[i]=((2ll*B[i]-C[i])%mo+mo)%mo;
}
IL void getdao(int *A,int *B,int len)
{
for (int i=;i<len-;i++)
B[i]=1ll*A[i+]*(i+)%mo;
B[len-]=;
}
IL void getjf(int *A,int *B,int len)
{
for (int i=;i<len;i++)
B[i]=1ll*A[i-]*fsp(i,mo-)%mo;
B[]=;
}
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==) {B[]=; return;}
getexp(A,B,(len+)>>);
getln(B,C,len);
rep(i,,len-) C[i]=((-C[i]+A[i])%mo+mo)%mo;
C[]=(C[]+)%mo;
getcj(C,B,len);
}
int main()
{
freopen("10.in","r",stdin);
freopen("1.out","w",stdout);
int n1;
read(n1); read(mo);
x1[]=;
rep(i,,n1) read(x1[i]);
p=(n1+)<<; init();
getln(x1,x2,n1+);
rep(i,,n1)
{
for (int j=;j*i<=n1;j++)
x2[i*j]=(x2[i*j]-1ll*x2[i]*fsp(j,mo-))%mo;
}
int cnt=;
rep(i,,n1) if (x2[i]) cnt++;
wer(cnt); wer2();
rep(i,,n1) if (x2[i]) wer(i),wer1();
wer2();
fwrite(sr,,C1+,stdout);
return ;
}
[BZOJ4913][SDOI2017]遗忘的集合的更多相关文章
- [SDOI2017]遗忘的集合
[SDOI2017]遗忘的集合 综合了很多套路的题 一看就是完全背包 生成函数! 转化为连乘积形式 Pi....=F 求Ln! 降次才可以解方程 发现方程是: f[i]=∑t|i : bool(t)* ...
- [LOJ2271] [SDOI2017] 遗忘的集合
题目链接 LOJ:https://loj.ac/problem/2271 洛谷:https://www.luogu.org/problemnew/show/P3784 BZOJ太伤身体死活卡不过还是算 ...
- 洛谷P3784 [SDOI2017]遗忘的集合(生成函数)
题面 传送门 题解 生成函数这厮到底还有什么是办不到的-- 首先对于一个数\(i\),如果存在的话可以取无限多次,那么它的生成函数为\[\sum_{j=0}^{\infty}x^{ij}={1\ove ...
- [题解] LuoguP3784 [SDOI2017]遗忘的集合
要mtt的题都是...... 多补了几项就被卡了一整页......果然还是太菜了...... 不说了......来看100分的做法吧...... 如果做过付公主的背包,前面几步应该不难想,所以我们再来 ...
- 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} ...
随机推荐
- (转)Java8内存模型—永久代(PermGen)和元空间(Metaspace)
背景:介绍java8中永久代到元空间的转变. Java8内存模型—永久代(PermGen)和元空间(Metaspace) 一.JVM 内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法 ...
- (二)Qt窗口应用程序Widget
QMainWindow,QWidget,QDialog,这三基类都可以作为顶层窗口 QWidget:是所有窗口类的父类,功能最简单 QMainWindow:如果窗口需要菜单栏,工具栏,状态栏,就需要Q ...
- latex 一些使用
texlive安装 https://blog.csdn.net/qq_38386316/article/details/80272396 管理员权限打开.bat 语言的安装可以减少 texwork 一 ...
- Security+认证812分轻松考过(备战分享)
2019.02.12,开工第一天,我参加了security+考试并顺利通过了考试,812分的成绩有点出乎我的意料,据我所知我周围还没有人考过800分的.怀着愉悦的心态分享下我的备考经历和考试经验. 备 ...
- linux log4j乱码问号的解决
原因: linux本地设置的文件编码格式不是UTF-8 解决办法: 运行locale命令看一下结果: 把LC_CTYPE修改为“zh_CN.UTF-8”: cd ~/ vi .bashrc 添加: L ...
- 安装python caffe过程中遇到的一些问题以及对应的解决方案
关于系统环境: Ubuntu 16.04 LTS cuda 8.0 cudnn 6.5 Anaconda3 编译pycaffe之前需要配置文件Makefile.config ## Refer to h ...
- Java转换流、缓冲流、流操作规律整理
转换流 1.1 OutputStreamWriter类 OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的字符编码表,将要写入流中的字符编码成字 ...
- 网页三剑客之JS
1.javascrapt介绍 js概述 JavaScript是运行在浏览器端的脚步语言,JavaScript主要解决的是前端与用户交互的问题,包括使用交互与数据交互. JavaScript是浏览器解释 ...
- 33. Springboot 系列 原生方式引入Redis,非RedisTemplate
0.pom.xml <dependency> <groupId>redis.clients</groupId> <artifactId>jedis&l ...
- nginx php程序 文件上传大小限制
关于 PHP 程序上传限制 更改 php.ini 配置文件 upload_max_filesize = 5M post_max_size = 16M 通过 nginx 环境限制上传大小: 可以在 ht ...