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 种不同 ...
随机推荐
- 用c语言产生随机数的方法
用c语言产生随机数的方法 在C语言中,rand()函数可以用来产生随机数,但是这不是真正意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列 ...
- 【Asp.Net WebFrom】分页
Asp.Net WebForm 分页 一. 前言 Asp.Net WebForm 内置的DataPager让人十分蛋疼 本文使用的分页控件是第三方分页控件 AspNetPager,下载地址: 链接: ...
- BZOJ 1087状态压缩DP
状态压缩DP真心不会写,参考了别人的写法. 先预处理出合理状态, 我们用二进制表示可以放棋子的状态,DP[I][J][K]:表示现在处理到第I行,J:表示第I行的状态,K表示现在为止一共放的棋子数量. ...
- webservice wsdl 生成服务
由于之前的示例是在当前项目下发布的server,也是在当前项目下访问的server发布的webservice.但在实际应用中,我们的服务端往往是和客户諯分离的,甚至它们是不同的项目中不同的人写的.而像 ...
- C++ 类的成员函数指针 ( function/bind )
这个概念主要用在C++中去实现"委托"的特性. 但现在C++11 中有了 更好用的function/bind 功能.但对于类的成员函数指针的概念我们还是应该掌握的. 类函数指针 就 ...
- 【linux】打印字符串中指定行
只打印第10行 关键在于当行数小于10时不输出. 用 head tail的关键问题是当行数小于10的时候用 head -n 10 只会打出前面的行,再用tail就错了. 所以要知道源文件一共有多少行. ...
- js正则表达式用法大全
匹配中文字符的正则表达式: [u4e00-u9fa5] 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了 匹配双字节字符(包括汉字在内):[^x00-xff] 评注:可以用来计算字符串的长度(一 ...
- 如何在solution中添加一个test case
在solution Explorer中右键点击需要添加的folder,选择Add-New Item.也可以选择使用相应Unit Test之类的.Generic Test一般用于创建manual cas ...
- Java多线程-线程的调度(守护线程)
本文转自http://www.cnblogs.com/linjiqin/p/3210004.html 感谢作者 守护线程与普通线程写法上基本没啥区别,调用线程对象的方法setDaemon(true), ...
- scp在Linux主机之间复制不用输入密码
把你的本地主机用户的ssh公匙文件复制到远程主机用户的~/.ssh/authorized_keys文件中,假设本地主机linux(10.1.1.1),远程主机linux(10.1.1.2) 一,在li ...