原文链接www.cnblogs.com/zhouzhendong/p/UOJ129.html

题解

  考虑把大于等于 $\sqrt n$ 的质数和小于 $\sqrt  n$ 的分开考虑:

  1. 小于等于 $\sqrt n$ 的质数最多只有 8 个。

  2. 一个小于等于 n 的正整数最多包含 1 个 大于 $\sqrt n$ 的质因子,所以不同的这种质因子可以分离。

  考虑对双方掌控了哪些小于等于 $\sqrt n$ 的质数进行状压,然后按照除去小于等于 $\sqrt n$ 的因子后的值,将所有数分成若干类,考虑对同一类不同时出现在两个人手上的方案数进行 DP 即可。

  时间复杂度 $O(3 ^ 8 \cdot n )$ 。

代码

#include <bits/stdc++.h>
#define clr(x) memset(x,0,sizeof (x))
#define For(i,a,b) for (int i=a;i<=b;i++)
#define Fod(i,b,a) for (int i=b;i>=a;i--)
#define pb(x) push_back(x)
#define mp(x,y) make_pair(x,y)
#define fi first
#define se second
#define real __zzd001
#define _SEED_ ('C'+'L'+'Y'+'A'+'K'+'I'+'O'+'I')
#define outval(x) printf(#x" = %d\n",x)
#define outvec(x) printf("vec "#x" = ");for (auto _v : x)printf("%d ",_v);puts("")
#define outtag(x) puts("----------"#x"----------")
#define outarr(a,L,R) printf(#a"[%d...%d] = ",L,R);\
For(_v2,L,R)printf("%d ",a[_v2]);puts("");
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
typedef vector <int> vi;
LL read(){
LL x=0,f=0;
char ch=getchar();
while (!isdigit(ch))
f|=ch=='-',ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return f?-x:x;
}
const int N=505;
int n,mod;
void Add(int &x,int y){
if ((x+=y)>=mod)
x-=mod;
}
void Del(int &x,int y){
if ((x-=y)<0)
x+=mod;
}
int dp[2][1<<9][1<<9];
int p[8]={2,3,5,7,11,13,17,19};
int a[N],val[N],sit[N];
bool cmp(int a,int b){
return val[a]<val[b];
}
int main(){
n=read(),mod=read();
For(i,2,n){
a[i]=i;
val[i]=i,sit[i]=0;
For(j,0,7)
if (val[i]%p[j]==0){
sit[i]|=1<<j;
while (val[i]%p[j]==0)
val[i]/=p[j];
}
if (val[i]!=1)
sit[i]|=1<<8;
}
sort(a+2,a+n+1,cmp);
dp[0][0][0]=1;
For(id,2,n){
int v=a[id],s=sit[v];
int T0=id&1,T1=T0^1;
For(i,0,511){
int ii=i^511;
for (int j=ii;j>=0;j=(j-1)&ii){
dp[T1][i][j]=0;
if (!j)
break;
}
}
if (val[v]!=val[a[id-1]]){
For(i,0,511){
int ii=i^511;
for (int j=ii;j>=0;j=(j-1)&ii){
if (dp[T0][i][j]){
if (i>>8){
Add(dp[T0][i^1<<8][j],dp[T0][i][j]);
dp[T0][i][j]=0;
}
else if (j>>8){
Add(dp[T0][i][j^1<<8],dp[T0][i][j]);
dp[T0][i][j]=0;
}
}
if (!j)
break;
}
}
}
For(i,0,511){
int ii=i^511;
for (int j=ii;j>=0;j=(j-1)&ii){
if (dp[T0][i][j]){
Add(dp[T1][i][j],dp[T0][i][j]);
if (!(i&s))
Add(dp[T1][i][j|s],dp[T0][i][j]);
if (!(j&s))
Add(dp[T1][i|s][j],dp[T0][i][j]);
}
if (!j)
break;
}
}
}
int ans=0;
For(i,0,511)
For(j,0,511)
Add(ans,dp[(n&1)^1][i][j]);
cout<<ans<<endl;
return 0;
}

  

UOJ#129. 【NOI2015】寿司晚宴 动态规划的更多相关文章

  1. [UOJ#129][BZOJ4197][Noi2015]寿司晚宴

    [UOJ#129][BZOJ4197][Noi2015]寿司晚宴 试题描述 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司 ...

  2. BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划

    BZOJ_4197_[Noi2015]寿司晚宴_状态压缩动态规划 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被 ...

  3. [BZOJ4197][Noi2015]寿司晚宴

    4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 412  Solved: 279[Submit][Status] ...

  4. BZOJ 4197: [Noi2015]寿司晚宴( dp )

    N^0.5以内的质数只有8个, dp(i, j, k)表示用了前i个大质数(>N^0.5), 2人选的质数(<=N^0.5)集合分别为j, k时的方案数. 转移时考虑当前的大质数p是给哪个 ...

  5. [NOI2015]寿司晚宴 --- 状压DP

    [NOI2015]寿司晚宴 题目描述 为了庆祝NOI的成功开幕,主办方为大家准备了一场寿司晚宴. 小G和小W作为参加NOI的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了n−1种不同的寿 ...

  6. 【BZOJ4197】[Noi2015]寿司晚宴 状压DP+分解质因数

    [BZOJ4197][Noi2015]寿司晚宴 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴 ...

  7. BZOJ 4197: [Noi2015]寿司晚宴 状态压缩 + 01背包

    4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec  Memory Limit: 512 MB Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿 ...

  8. BZO4197 & 洛谷2150 & UOJ129:[NOI2015]寿司晚宴——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4197 https://www.luogu.org/problemnew/show/P2150 ht ...

  9. NOI2015 寿司晚宴

    今年NOI确实是在下输了.最近想把当时不会做的题都写一下. 题意 从2到n(500)这些数字中,选若干分给A,若干分给B,满足不存在:A的某个数和B的某个数的GCD不等于1. 对于寿司晚宴这题,标准解 ...

  10. bzoj 4199 [NOI2015]寿司晚宴

    Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不同 ...

随机推荐

  1. Linux uniq 命令

    Linux uniq 命令  Linux 命令大全 Linux uniq 命令用于检查及删除文本文件中重复出现的行列,一般与 sort 命令结合使用. uniq 可检查文本文件中重复出现的行列. 语法 ...

  2. thinkphp5 去除缓存

    array_map('unlink', glob(TEMP_PATH . '/*.php')); rmdir(TEMP_PATH);

  3. DML、DDL、DCL的分别是什么

    DML.DDL.DCL的分别是什么 一直以来,分不清这三者的简称代表什么,甚至在面试中遇到可能会张冠李戴.今天特意记录一下. 一.DML(data manipulation language) 数据操 ...

  4. 使用Docker+Jenkins自动构建部署

    环境 Windows 10 Docker Version 18.06.1-ce-win73 (19507) 运行jenkins 运行jenkins 容器 docker run -d --name ln ...

  5. Node.js目录

    [相关学习] npm入门教程 [基础] (1) 初识Node.js (2) 开发环境和调试工具 (3) commonJs 规范 (4) node 概念(global.process进程.调试) (5) ...

  6. JavaScript 修改 CSS 伪类属性

    背景 有时候我们希望通过JS代码控制伪类属性, 确苦于对策 实际上可通过向document.head中添加style子元素来实现 演示 function css(style_text) { var s ...

  7. KAGGLE竟赛

    KAGGLE竟赛 关于kaggle的竟赛规则我们勇闯组做出了一些说明,大家可以借鉴一下如何参加kaggle,参加kaggle大赛的一些注意事项,自己参加一些项目,一定会使你的知识量得到质的提升 这是链 ...

  8. APPLE-SA-2019-3-27-1 watchOS 5.2

    APPLE-SA-2019-3-27-1 watchOS 5.2 watchOS 5.2 is now available and addresses the following: CFStringA ...

  9. 手把手编写PHP MVC框架实例教程

    源地址:https://www.awaimai.com/128.html#comment-27466 这个不错,用php实现mvc最核心功能,代码量只有几十K. 其实,不管用那种方法,最终都是incl ...

  10. java 中类的方法

    object类,即所有类的父类, getClass() 返回对象执行时的Class实例, getClass().getName();// 返回类的名字 toString();// equals();/ ...