bzoj4197
这题现场想的思路方向都是对的,但限于现场和实力因素没能A
很显然我们会想到质因数的选取
如果某个质数p被W选了,那G就不能选含有质因子p的数
因此我们不难想到状压质数的选取情况,令f[i][j]为w质数选取状态为i,g质数选取状态j的方案数
但是500以内质数太多了怎么办?我们考虑大质数能不能分开考虑
考虑到sqrt(500)以外的质数,他们在每个数中最多出现一次,因此我们只要按这些质数分类做dp即可
这样需要状压的质数只有2,3,5,7,11,13,17,23这8个了,这样就可以解决了
具体的,我用state表示每个数前8个质数的含有情况,res表示除去前8个质数剩下的数
然后按照res排序做dp即可
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<stdlib.h>
#include<algorithm> using namespace std;
const int sp[]={2,3,5,7,11,13,17,19};
struct node{int res,st;} a[]; int f[][],g[][][];
int ans,n,p;
bool cmp(node a,node b)
{
return a.res<b.res;
}
int main()
{
scanf("%d%d",&n,&p);
for (int i=2; i<=n; i++)
{
int x=i;
for (int j=0; j<8; j++)
if (x%sp[j]==0)
{
a[i].st+=1<<j;
while (x%sp[j]==0) x/=sp[j];
}
a[i].res=x;
}
sort(a+,a++n,cmp);
f[][]=g[][][]=g[][][]=;
for (int i=; i<=n; i++)
{
memcpy(g[0],f,sizeof(f));
memcpy(g[1],f,sizeof(f));
for (int u=0; u<256; u++)
for (int v=0; v<256; v++)
if ((u&v)==0)
{
if ((a[i].st&v)==0) g[0][u|a[i].st][v]=(g[0][u|a[i].st][v]+f[u][v])%p;
if ((a[i].st&u)==0) g[1][u][v|a[i].st]=(g[1][u][v|a[i].st]+f[u][v])%p;
} if (a[i].res!=)
{
int j;
for (j=i+1; j<=n&&a[j].res==a[i].res; j++)
for (int u=255;u>=0;u--)
for (int v=255;v>=0;v--)
if ((u&v)==0)
{
if ((a[j].st&v)==0) g[0][u|a[j].st][v]=(g[0][u|a[j].st][v]+g[0][u][v])%p;
if ((a[j].st&u)==0) g[1][u][v|a[j].st]=(g[1][u][v|a[j].st]+g[1][u][v])%p;
}
i=j-;
}
for (int u=; u<; u++)
for (int v=; v<; v++)
f[u][v]=((g[][u][v]+g[][u][v]-f[u][v])%p+p)%p;
}
for (int i=; i<=; i++)
for (int j=; j<=; j++)
if ((i&j)==) ans=(ans+f[i][j])%p;
printf("%d\n",ans);
return ;
}
bzoj4197的更多相关文章
- 【BZOJ4197】【NOI2015】寿司晚宴(动态规划)
[BZOJ4197][NOI2015]寿司晚宴(动态规划) 题面 BZOJ 从\([2,n]\)中选择两个集合(可以为空集),使得两个集合中各选一个数出来,都互质. 求方案数. 题解 对于\(500\ ...
- BZOJ4197 [Noi2015]寿司晚宴 【状压dp】
题目链接 BZOJ4197 题解 两个人选的数都互质,意味着两个人选择了没有交集的质因子集合 容易想到将两个人所选的质因子集合作为状态\(dp\) \(n\)以内质数很多,但容易发现\(\sqrt{n ...
- 【BZOJ4197】[Noi2015]寿司晚宴 状压DP+分解质因数
[BZOJ4197][Noi2015]寿司晚宴 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴 ...
- [UOJ#129][BZOJ4197][Noi2015]寿司晚宴
[UOJ#129][BZOJ4197][Noi2015]寿司晚宴 试题描述 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司 ...
- 【BZOJ-4197】寿司晚宴 状压DP
4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 694 Solved: 440[Submit][Status] ...
- [BZOJ4197][Noi2015]寿司晚宴
4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 412 Solved: 279[Submit][Status] ...
- BZOJ4197[NOI2005]寿司晚宴
Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不同 ...
- 【BZOJ4197】【Noi2015】寿司晚宴
Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不同 ...
- Bzoj4197 寿司晚宴
Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不同 ...
随机推荐
- Linux安装Flash player
在线自动更新:Flash Player Update(需java) ===================== 下载得到install_flash_player_11_linux.x86_64.tar ...
- [转]日期格式化(yyyy-MM-dd)中,为什么 M 多大写?
最近犯了个可傻逼的错误,格式化年月日的时候不小心将yyyy-MM-dd写成YYYY-MM-dd,导致格式化结果中年不正确. 看看知乎上的说法 问题: http://www.zhihu.com/ques ...
- CentOS 6下安装nginx
原文:http://yubosun.akhtm.com/tech/centos-nginx.htm 1 在nginx官方网站下载一个rpm包,下载地址是:http://nginx.org/en/dow ...
- 如何开发一个自己的 RubyGem?
「如何测试你的 RubyGem?」的前导文章 什么是 RubyGem RubyGem 是 Ruby 语言的标准源码打包格式. 大家一直都在用gem这个命令,但是很少有人知道这个东西是怎么来的,这里我从 ...
- HDU 4496 D-City(并查集,逆思维)
题目 熟能生巧...常做这类题,就不会忘记他的思路了... //可以反过来用并查集,还是逐个加边,但是反过来输出...我是白痴.....又没想到 //G++能过,C++却wa,这个也好奇怪呀... # ...
- PATH环境变量和CLASSPATH环境变量详解
大凡装过JDK的人都知道要安装完成后要设置环境变量,可是为什么要设置环境变量呢?环境变量有什么作用? 1)PATH详解: 计算机安装JDK之后,输入“javac”“java”之类的命令是不能马上被计算 ...
- Linux下搭建Android NDK , Linux 驱动开发环境
Eclispe Luna(4.4):http://www.eclipse.org/downloads/ CDT :http://www.eclipse.org/cdt/downloads.php AD ...
- hdu 4767 Bell
思路:矩阵快速幂+中国剩余定理!! 查资料得到2个公式: 1) B[n+p] = B[n] + B[n+1] mod p ; 2) B[p^m+n] = ...
- poj 1085 Triangle War 博弈论+记忆化搜索
思路:总共有18条边,9个三角形. 极大极小化搜索+剪枝比较慢,所以用记忆化搜索!! 用state存放当前的加边后的状态,并判断是否构成三角形,找出最优解. 代码如下: #include<ios ...
- poj 1724(有限制的最短路)
题目链接:http://poj.org/problem?id=1724 思路: 有限制的最短路,或者说是二维状态吧,在求最短路的时候记录一下花费即可.一开始用SPFA写的,900MS险过啊,然后改成D ...