p2150 [NOI2015]寿司晚宴
分析
我们发现对于大于$\sqrt(n)$的数每个数最多只会包含一个
所以我们把每个数按照大质数的大小从小到大排序
我们知道对于一种大质数只能被同一个人取
所以f1表示被A取,f2表示被B取
最终答案就是这两个的答案减去啥都不去的答案
因为啥都不去会被重复记录两次
对于小质数则直接状压转移即可
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
#define int long long
const int p1[] = {,,,,,,,,};
const int cnt1 = ;
int dp[][],n,mod,f1[][],f2[][];
struct node {
int msk,ano;
};
node d[];
inline void init(int x){
int res=x+;
for(int i=;i<=cnt1;i++){
if(res==)break;
if(res%p1[i]==)d[x].msk|=(<<(i-));
while(res%p1[i]==)res/=p1[i];
}
d[x].ano=res;
}
inline bool cmp(const node x,const node y){return x.ano<y.ano;}
signed main(){
int i,j,k,p,q;
scanf("%lld%lld",&n,&mod);
n--;
for(i=;i<=n;i++)init(i);
sort(d+,d+n+,cmp);
dp[][]=;
for(i=;i<=n;i++){
if(d[i].ano==||d[i].ano!=d[i-].ano){
memcpy(f1,dp,sizeof(f1));
memcpy(f2,dp,sizeof(f2));
}
for(j=(<<)-;j>=;j--)
for(k=(<<)-;k>=;k--)if(!(j&k)){
int msk1=j|d[i].msk,msk2=k|d[i].msk;
if(!(msk1&k))f1[msk1][k]=(f1[msk1][k]+f1[j][k])%mod;
if(!(msk2&j))f2[j][msk2]=(f2[j][msk2]+f2[j][k])%mod;
}
if(d[i].ano==||d[i].ano!=d[i+].ano||i==n){
for(j=(<<)-;j>=;j--)
for(k=(<<)-;k>=;k--)if(!(j&k)){
dp[j][k]=(-dp[j][k]+mod)%mod;
dp[j][k]=(dp[j][k]+f1[j][k])%mod;
dp[j][k]=(dp[j][k]+f2[j][k])%mod;
}
}
}
int Ans=;
for(j=;j<(<<);j++)
for(k=;k<(<<);k++)
if(!(j&k))Ans=(Ans+dp[j][k])%mod;
cout<<Ans;
return ;
}
p2150 [NOI2015]寿司晚宴的更多相关文章
- 洛谷$P2150\ [NOI2015]$寿司晚宴 $dp$
正解:$dp$ 解题报告: 传送门$QwQ$. 遇事不决写$dp$($bushi$.讲道理这题一看就感觉除了$dp$也没啥很好的算法能做了,于是考虑$dp$呗 先看部分分?$30pts$发现质因数个数 ...
- UOJ #129 / BZOJ 4197 / 洛谷 P2150 - [NOI2015]寿司晚宴 (状压dp+数论+容斥)
题面传送门 题意: 你有一个集合 \(S={2,3,\dots,n}\) 你要选择两个集合 \(A\) 和 \(B\),满足: \(A \subseteq S\),\(B \subseteq S\), ...
- 并不对劲的bzoj4197:loj2131:uoj129:p2150:[NOI2015]寿司晚宴
题目大意 有两个集合\(S_1,S_2 \subseteq [2,n] (n\leq 500)\),且对于\(\forall x\in S_1,y\in S_2 , gcd(x,y)=1\) 求\(S ...
- [BZOJ4197][Noi2015]寿司晚宴
4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 412 Solved: 279[Submit][Status] ...
- BZOJ 4197: [Noi2015]寿司晚宴( dp )
N^0.5以内的质数只有8个, dp(i, j, k)表示用了前i个大质数(>N^0.5), 2人选的质数(<=N^0.5)集合分别为j, k时的方案数. 转移时考虑当前的大质数p是给哪个 ...
- BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划
BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被 ...
- [NOI2015]寿司晚宴 --- 状压DP
[NOI2015]寿司晚宴 题目描述 为了庆祝NOI的成功开幕,主办方为大家准备了一场寿司晚宴. 小G和小W作为参加NOI的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了n−1种不同的寿 ...
- 【BZOJ4197】[Noi2015]寿司晚宴 状压DP+分解质因数
[BZOJ4197][Noi2015]寿司晚宴 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴 ...
- [UOJ#129][BZOJ4197][Noi2015]寿司晚宴
[UOJ#129][BZOJ4197][Noi2015]寿司晚宴 试题描述 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司 ...
随机推荐
- 转载 matlab矩阵数组常用操作
一. length 返回矩阵最长维的的长度 ndims 返回维数 numel 返回矩阵元素个数size ...
- 11.7noip模拟赛
题解:广义斐波那契数列 矩阵乘法 #include<iostream> #include<cstdio> #include<cstring> #define LL ...
- 04:sqlalchemy操作数据库 不错
目录: 1.1 ORM介绍(作用:不用原生SQL语句对数据库操作) 1.2 安装sqlalchemy并创建表 1.3 使用sqlalchemy对表基本操作 1.4 一对多外键关联 1.5 sqlalc ...
- Ubantu 新建用户后没有生成对应文件夹
原命令:useradd python 改正后:useradd python -m 后成功在home目录下创建文件夹 原因: man useradd就可以看到如此介绍:Create the user´s ...
- 两种方式创建Maven项目【方式二】
1.不勾选Create a simple project,直接点击下一步 2.选择maven-archetype-webapp下一步 3.填写相关信息,点击下一步完成 4.此时会报一个jsp的错误.我 ...
- 有关Botton的用法(二)
关于设置listener监听onClicked事件的步骤分析 Steps: 1.tell android you are interested in listening to a button cli ...
- sqlserver卸载
- 1110 Complete Binary Tree
1110 Complete Binary Tree (25)(25 分) Given a tree, you are supposed to tell if it is a complete bina ...
- 使用模板创建第一个Web API项目
软件环境 vs 2015 update3 本节将通过例子讲述创建Web API 项目的方法 第一步,打开vs ,依次通过[文件]菜单,[新建][项目]命令,大致步骤如下图 : 第2步,在弹出对话框 ...
- 笔记:Tid设计思维
Tid设计思维 2017年7月19日TiD大会创新设计论坛 一. 设计思维实践: 为什么他能觉察你看不到的机会 1. 原因一:[觉察]与[看] 他(们)能“觉察”你“看”不到的机会,他们 ...