Description

有一个集合U={1,2,…,n),要从中选择k个元素作为一个子集A。
若a∈A,则要有a*X不属于A,x是一个给定的数。
求可选方案对M取模后的值。
 1< = N< = 10^18,2< = m< = 1000000,0< = K< = 1000,2< = x< = 10。

Input

第一行输入N,M,K,X

Output

如题

将不能共存的数连边,每个联通块都是一条链,计算出每个长度的链的条数,以及每个长度的链上取0~k个数的方案数,卷积可得答案。时间复杂度$O(klog(k)log(n)log_x(n))$

#include<cstdio>
#include<cmath>
#include<algorithm>
typedef unsigned long long u64;
typedef long double ld;
const ld pi=std::acos(-);
struct cplx{
ld a,b;
cplx(ld x=,ld y=):a(x),b(y){}
cplx operator+(cplx x){return cplx(a+x.a,b+x.b);}
cplx operator-(cplx x){return cplx(a-x.a,b-x.b);}
cplx operator*(cplx x){return cplx(a*x.a-b*x.b,a*x.b+b*x.a);}
cplx conj(){return cplx(a,-b);}
}A[],B[],E[][][];
u64 n,pwx[],ts[];
int m,k,x,ppx=,C[][],N,K;
int ans[],tmp[],tmp2[],rev[];
void dft(cplx*a,int t){
for(int i=;i<N;++i)if(i<rev[i])std::swap(a[i],a[rev[i]]);
for(int i=,z=;i<N;i<<=,++z){
cplx*e=E[t][z];
for(int j=;j<N;j+=i<<){
cplx*b=a+j,*c=b+i;
for(int k=;k<i;++k){
cplx x=b[k],y=c[k]*e[k];
b[k]=x+y;
c[k]=x-y;
}
}
}
if(t)for(int i=;i<N;++i)a[i].a/=N;
}
void mul(int*a,int*b){
for(int i=;i<=k;++i)B[i]=cplx(a[i],b[i]);
for(int i=k+;i<N;++i)B[i]=;
dft(B,);
B[N]=B[];
for(int i=;i<N;++i){
cplx x=B[i],y=B[N-i].conj();
A[i]=cplx(,0.25)*(y+x)*(y-x);
}
dft(A,);
for(int i=;i<=k;++i)a[i]=((long long)(A[i].a+0.49))%m;
}
int main(){
scanf("%llu%d%d%d",&n,&m,&k,&x);
C[][]=;
for(int i=;i<;++i){
for(int j=;j<=i;++j){
(C[i+][j]+=C[i][j])%=m;
(C[i+][j+]+=C[i][j])%=m;
}
}
for(pwx[ppx++]=;(pwx[ppx]=pwx[ppx-]*x)<=n;++ppx);
for(int i=ppx-;i>=;--i){
ts[i]=n/pwx[i];
ts[i]-=ts[i]/x;
}
for(N=,K=;N<k*+;N<<=,++K);
for(int i=;i<N;++i)rev[i]=rev[i>>]>>|(i&)<<K;
for(int i=,z=;i<N;i<<=,++z){
for(int j=;j<i;++j){
E[][z][j]=cplx(cos(j*pi/i),sin(j*pi/i));
E[][z][j]=E[][z][j].conj();
}
}
ans[]=;
for(int i=;i<ppx;++i){
ts[i]-=ts[i+];
for(int j=;j<=k;++j)tmp[j]=(i+-j>=?C[i+-j][j]:),tmp2[j]=;
tmp2[]=;
for(u64 t=ts[i];t;t>>=,mul(tmp,tmp))if(t&)mul(tmp2,tmp);
mul(ans,tmp2);
}
printf("%d\n",ans[k]);
return ;
}

bzoj3491: PA2007 Subsets的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. Subsets II

    Given a collection of integers that might contain duplicates, nums, return all possible subsets. Not ...

  3. Subsets

    Given a set of distinct integers, nums, return all possible subsets. Note: The solution set must not ...

  4. [LeetCode] Subsets II 子集合之二

    Given a collection of integers that might contain duplicates, S, return all possible subsets. Note: ...

  5. [LeetCode] Subsets 子集合

    Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset must be ...

  6. LeetCode:Subsets I II

    求集合的所有子集问题 LeetCode:Subsets Given a set of distinct integers, S, return all possible subsets. Note: ...

  7. 【leetcode】Subsets II (middle) ☆

    Given a collection of integers that might contain duplicates, S, return all possible subsets. Note: ...

  8. 【leetcode】Subsets (Medium) ☆

    Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset must be ...

  9. [Leetcode] Subsets II

    Given a collection of integers that might contain duplicates, S, return all possible subsets. Note: ...

随机推荐

  1. HDU5952 Counting Cliques (暴力深搜+剪枝) (2016ACM/ICPC亚洲赛区沈阳站 Problem E)

    题目链接:传送门 题目: Counting Cliques Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total S ...

  2. Nginx环境搭建准备

    前提: 1.确认系统网络 2.确认yum可用 3.确认关闭iptables规则 4.确认停用selinux 1.cd /opt mkdir app download logs work backup ...

  3. 一个简易的drf的项目例子

    luffy_city 1.项目介绍 今日内容:(路飞项目) contentType组件: 路飞学成项目,有课程,学位课(不同的课程字段不一样),价格策略 问题, 如何设计表结构,来表示这种规则 为专题 ...

  4. 为移动端而设计的bootstrap的使用

    一.下载 --bs ---css ----bootstrap.css ----bootstrap.min.css ---fonts ---js ----bootstrap.js ----jquery. ...

  5. acm 2057

    ////////////////////////////////////////////////////////////////////////////////#include<iostream ...

  6. Easyui combobox下拉框默认选中第一项

    var val = $(#cc).combobox("getData");for (var item in val[0]) {       if (item == "gr ...

  7. 关于Spring IOC的学习和理解

    面向对象——三层架构(表现层.业务层.持久层) 三层架构:即表现层.业务层.持久层. ① 持久层:采用DAO模式,建立实体类和数据库表映射(ORM映射).也就是哪个类对应哪个表,哪个属性对应哪个列.持 ...

  8. sqlyog数据库管理软件下载

    下载安装包 一路next 链接:https://pan.baidu.com/s/1tdIwtYEW11MNWk--Hqd3dw 提取码:0ffp 复制这段内容后打开百度网盘手机App,操作更方便哦 然 ...

  9. springboot收藏的博客

    1.纯洁的微笑:http://www.ityouknow.com/ 2.嘟嘟独立博客:http://tengj.top/ 3.http://blog.didispace.com/

  10. C# WinForm 菜单项的大小、高宽的手动控制

    控制菜单项的第一级的下级菜单项的大小: 直接通过(ContextMenuStrip对象).AutoSize = false.(ContextMenuStrip对象).Size = new Size(5 ...