bzoj 2734 集合选数
来源:互联网 发布:win10如何关闭端口 编辑:程序博客网 时间:2024/06/06 13:56
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define ll long long
#define inf 1e9
#define eps 1e-10
#define md 1000000001
#define N
using namespace std;
int a[20][15],b[20],mi[20];
ll f[20][5010];
bool vis[100010];
int n;
ll ans=1;
void add(ll &x,ll y)
{
x=x+y; if (x>=md) x-=md;
}
void solve(int x)
{
for (int i=1,now=x;i<=18;i++,now*=2)
{
if (now<=n)
{
a[i][1]=now;
vis[now]=1;
b[i]=mi[1];
}
else
{
a[i][1]=n+1;
b[i]=0;
now=n+1;
}
}
for (int i=1;i<=18;i++)
for (int j=2;j<=11;j++)
{
int x=a[i][j-1]*3;
if (x<=n)
{
a[i][j]=x;
vis[x]=1;
b[i]+=mi[j];
}
else
{
a[i][j]=n+1;
}
}
for (int i=1;i<=18;i++)
for (int j=0;j<=b[i];j++)
f[i][j]=0;
b[0]=1; f[0][0]=1;
for (int i=0;i<18;i++)
{
for (int j=0;j<=b[i];j++)
if (f[i][j])
{
for (int k=0;k<=b[i+1];k++)
if ( (!(k&(k<<1))) && (!(j&k))) add(f[i+1][k],f[i][j]);
}
}
ans=ans*f[18][0]%md;
}
int main()
{
mi[1]=1; for (int i=2;i<=18;i++) mi[i]=mi[i-1]<<1;
ans=1;
scanf("%d",&n);
for (int i=1;i<=n;i++)
if (!vis[i]) solve(i);
printf("%lld\n",ans);
return 0;
}
- bzoj 2734 集合选数
- bzoj 2734 [HNOI2012]集合选数 dp
- BZOJ 2734: [HNOI2012]集合选数
- bzoj 2734: 2734: [HNOI2012]集合选数 (状压DP)
- BZOJ 2734 HNOI2012 集合选数 状压DP
- BZOJ 2734 [HNOI2012]集合选数 状压+思路
- 【BZOJ 2734】[HNOI2012]集合选数 状压dp
- BZOJ 2734: [HNOI2012]集合选数 乱搞DP
- (bzoj 2734 [HNOI2012]集合选数)<状压DP>
- bzoj 2734: [HNOI2012]集合选数 状压dp
- [BZOJ]2734 [HNOI2012] 集合选数 状压DP 思路神题
- 【BZOJ】【P2734】【HNOI2012】【集合选数】【状压DP】【题解】
- 2734: [HNOI2012]集合选数
- [HNOI2012]集合选数
- HNOI2012 集合选数
- [BZOJ2734]集合选数
- [HNOI2012]集合选数
- bzoj2734 集合选数
- web 后端学习记录1_jsp学习记录
- bzoj 2669 局部极小值
- bzoj 1049 数字序列
- bzoj 2121 字符串游戏
- bzoj 2054 疯狂的馒头
- bzoj 2734 集合选数
- bzoj 3594 方伯伯的玉米田
- bzoj 1818/1732 聚会
- heheda的数论专题练习
- bzoj 3997 组合数学
- bzoj 2039 人员雇佣
- git 中文文件名乱码
- linux下面ftp/wget命令下载文件夹目录
- SQLServer : EXEC和sp_executesql的区别