博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[HNOI2012]集合选数 BZOJ2734
阅读量:6801 次
发布时间:2019-06-26

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

分析:

构造法...每次找到一个没有被选过的数,用这个数推出一个表格,之后在表格上跑状压DP,时间复杂度O(n)

附上代码:

#include 
#include
#include
#include
#include
#include
#include
using namespace std;#define N 25#define M 1<<11#define mod 1000000001int f[N][M],a[N][N],b[N],K,n,m,vis[1000005];long long ans=1;int calc(int t){ memset(b,0,sizeof(b)); a[1][1]=t; for(int i=2;i<=18;i++) { a[i][1]=a[i-1][1]<<1; if(a[i][1]>n)a[i][1]=n+1; } for(int i=1;i<=18;i++) { for(int j=2;j<=11;j++) { a[i][j]=a[i][j-1]*3; if(a[i][j]>n)a[i][j]=n+1; } } for(int i=1;i<=18;i++) { for(int j=1;j<=11;j++) { if(a[i][j]<=n) { b[i]+=(1<<(j-1)); vis[a[i][j]]=1; } } } for(int i=0;i<=18;i++) { for(int S=0;S<=b[i];S++) { f[i][S]=0; } } f[0][0]=1; for(int i=1;i<=18;i++) { for(int S=0;S<=b[i-1];S++) { if(!f[i-1][S])continue; for(int s=0;s<=b[i];s++) { if((S&s)||(s&(s<<1)))continue; f[i][s]=(f[i][s]+f[i-1][S])%mod; } } } return f[18][0];}int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) { if(!vis[i]) { ans=(ans*calc(i))%mod; } } printf("%lld\n",ans); return 0;}

  

转载于:https://www.cnblogs.com/Winniechen/p/9080029.html

你可能感兴趣的文章
命令行管理远程windows.(Remote Command Line On Windows)
查看>>
调用webservice使用URLConnection调用webservice
查看>>
父亲节例行吐槽
查看>>
c#动态创建ODBC数据源
查看>>
修改visual studio2010 的快捷键,使用ctrl+W 关闭当前文档
查看>>
ckeditor
查看>>
架构和框架的区别
查看>>
webservice系统学习笔记5-手动构建/发送/解析SOAP消息
查看>>
[原创]项目管理知识体系指南之 4项目整合管理思维导图
查看>>
经典网页设计:20个华丽的 iPhone 应用程序演示网站
查看>>
Flash:DisplayObject的transform/matrix的潜规则、小bug
查看>>
汗,Google又调整了编译工具(升级SDK先备份!!!)
查看>>
iOS 里RGB 配色 UIColor colorWithRed
查看>>
Windows环境下用C#编程将文件上传至阿里云OSS笔记
查看>>
android 读取SQLite android could not open the database in read/write mode错误
查看>>
构建高性能的ASP.NET应用程序
查看>>
抽离CodeIgniter的数据库访问类 可以独立使用
查看>>
android 关于InputDispatcher出现Consumer错误的解决办法
查看>>
Tomcat全攻略
查看>>
转:在MyEclipse下创建Java Web项目 入门(图文并茂)经典教程
查看>>