博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[luogu 3773][CTSC 2017]吉夫特
阅读量:6333 次
发布时间:2019-06-22

本文共 1253 字,大约阅读时间需要 4 分钟。

Solution

输入一个长度为n的数列,求有多少个长度大等于2的不上升子序列满足:

\[\prod_{i=2}^{k} C(a_{b_{i-1}},a_{b_i}) mod\ 2 >0 \]

答案对1e9+7取模

根据Lucas定理:

\[C\ (n,\ m)\ ≡\ C\ (\frac{n}{p},\frac{m}{p})*\ C\ (n\%p,\ m\%p)\ (mod\ p)\]

可以发现,只要满足m是n的子集,或者说是(n&m)=m即可。

f[i]表示从\(a_i\)开始的序列的数量,转移时枚举 \(a_i\)的子集,要判断一下它出现的位置是否在i之后

因为我们的\(a_i\)时互不相同的,所以,复杂度大概是\(O(3^{\log \max a_i})\)

写博客的真实原因其实是,pac弱到连枚举子集都不会

#include
#define ll long long#define max(a,b) ((a)>(b)?(a):(b))#define min(a,b) ((a)<(b)?(a):(b))#define swap(x,y) (x^=y^=x^=y)inline int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();} return x*f;}#define MN 211990#define MM 233335#define mod 1000000007int a[MN],pos[MM],f[MN];int n,ans;inline void add(int &x,int y){x+=y;x>=mod?x-=mod:0;}int main(){ n=read(); register int i,j; for(i=1;i<=n;++i) a[i]=read(),pos[a[i]]=i; for(i=n;i;--i) { f[i]=1; for(j=a[i]&(a[i]-1);j;j=a[i]&(j-1)) if(pos[j]>i) add(f[i],f[pos[j]]); add(ans,f[i]); } add(ans,mod-n); printf("%d\n",ans); return 0;}

所以呢,如何枚举子集?

for(i=S;i&=S;--i)


Blog来自PaperCloud,未经允许,请勿转载,TKS!

转载于:https://www.cnblogs.com/PaperCloud/p/10018111.html

你可能感兴趣的文章
winform datagridview 通过弹出小窗口来隐藏列 和冻结窗口
查看>>
Jquery闪烁提示特效
查看>>
最佳6款用于移动网站开发的 jQuery 图片滑块插件
查看>>
C++ String
查看>>
获取系统托盘图标的坐标及文本
查看>>
log4j Test
查看>>
HDU 1255 覆盖的面积(矩形面积交)
查看>>
Combinations
查看>>
SQL数据库无法附加,提示 MDF" 已压缩,但未驻留在只读数据库或文件组中。必须将此文件解压缩。...
查看>>
第二十一章流 3用cin输入
查看>>
在workflow中,无法为实例 ID“...”传递接口类型“...”上的事件“...” 问题的解决方法。...
查看>>
获取SQL数据库中的数据库名、所有表名、所有字段名、列描述
查看>>
Orchard 视频资料
查看>>
简述:预处理、编译、汇编、链接
查看>>
调试网页PAIP HTML的调试与分析工具
查看>>
路径工程OpenCV依赖文件路径自动添加方法
查看>>
玩转SSRS第七篇---报表订阅
查看>>
WinCE API
查看>>
SQL语言基础
查看>>
对事件处理的错误使用
查看>>