【NOI2015】寿司晚宴
题目链接:http://uoj.ac/problem/129
描述
为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴。小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴。
在晚宴上,主办方为大家提供了 n−1n−1 种不同的寿司,编号 1,2,3,…,n−11,2,3,…,n−1 ,其中第 ii 种寿司的美味度为 i+1i+1 (即寿司的美味度为从 22 到 nn )。
现在小 G 和小 W 希望每人选一些寿司种类来品尝,他们规定一种品尝方案为不和谐的当且仅当:小 G 品尝的寿司种类中存在一种美味度为 xx 的寿司,小 W 品尝的寿司中存在一种美味度为 yy 的寿司,而 xx 与 yy 不互质。
现在小 G 和小 W 希望统计一共有多少种和谐的品尝寿司的方案(对给定的正整数 pp 取模)。注意一个人可以不吃任何寿司。
输入格式
输入文件的第 11 行包含 22 个正整数 n,pn,p ,中间用单个空格隔开,表示共有 nn 种寿司,最终和谐的方案数要对 pp 取模。
输出格式
输出一行包含 11 个整数,表示所求的方案模 pp 的结果。
样例一
input
3 10000
output
9
样例二
input
4 10000
output
21
样例三
input
100 100000000
output
3107203
限制与约定
测试点编号 | n 的规模 | 约定 |
---|---|---|
1 | 2≤n≤30 | 0<p≤1000000000 |
2 | ||
3 | ||
4 | 2≤n≤100 | |
5 | ||
6 | 2≤n≤200 | |
7 | ||
8 | 2≤n≤500 | |
9 | ||
10 |
时间限制:1s
空间限制:512MB
题解
状压DP
很容易就想到只要两个集合中没有相同的质因数就满足条件了
注意,每个数中>sqrt(500)的数最多只有一个!!
于是,我们可以枚举出<sqrt(500)的质数,共八个
列DP:f[i][j][k]表示选到第i个数,A的状态为j,B的状态为k的方案数
然后呢?
我们对i分解质因数,并记录最大的质数以及它的状态
如:138=2*3*23,所以它的最大的质数为23,状态为3(二进制为11000000)
于是,f[i][j][k]+=f[i-1][j][k],f[i][j|s[i]][k]+=f[i-1][j][k],f[i][j][k|s[i]]+=f[i-1][j][k],
大质数的情况特判一下就好了
代码
#include <cstdio>
#include <algorithm>
using namespace std;
int i,j,k,n,m,x,y,t,mod,prime[],f[][<<][<<][];
struct data{int bi,su;}p[];
inline bool cmp(const data&a,const data&b){return a.bi<b.bi;}
int add(int &x,int y){x+=y;if (x>=mod)x-=mod;}
int main(){
scanf("%d%d",&n,&mod);
prime[]=;prime[]=;prime[]=;prime[]=;prime[]=;prime[]=;prime[]=;prime[]=;
for (i=;i<=n;i++){
int te=i;
for (j=;j<=;j++)
if (te%prime[j]==){
p[i].su|=<<j-;
while (te%prime[j]==)te/=prime[j];
}
p[i].bi=te;
}
sort(p+,p++n,cmp);f[][][][]=;
for (i=;i<=n;i++)
for (j=;j<(<<);j++)
for (k=;k<(<<);k++){
if ((j&k)==){
if (i==||p[i].bi==||p[i].bi!=p[i-].bi){
int te=;
add(te,f[i-][j][k][]);add(te,f[i-][j][k][]);add(te,f[i-][j][k][]);
add(f[i][j][k][],te);add(f[i][j|p[i].su][k][],te);add(f[i][j][k|p[i].su][],te);
}
else{
if (f[i-][j][k][]){add(f[i][j][k][],f[i-][j][k][]);add(f[i][j|p[i].su][k][],f[i-][j][k][]);add(f[i][j][k|p[i].su][],f[i-][j][k][]);}
if (f[i-][j][k][]){add(f[i][j][k][],f[i-][j][k][]);add(f[i][j|p[i].su][k][],f[i-][j][k][]);}
if (f[i-][j][k][]){add(f[i][j][k][],f[i-][j][k][]);add(f[i][j][k|p[i].su][],f[i-][j][k][]);}
}
}
}
int ans=;for (i=;i<(<<);i++)for (j=;j<(<<);j++)if ((i&j)==)for (k=;k<=;k++)add(ans,f[n][i][j][k]);
printf("%d\n",ans);
return ;
}
【NOI2015】寿司晚宴的更多相关文章
- [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 的选手,也被邀请参加了寿司 ...
- BZOJ 4197: [Noi2015]寿司晚宴 状态压缩 + 01背包
4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec Memory Limit: 512 MB Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿 ...
- NOI2015 寿司晚宴
今年NOI确实是在下输了.最近想把当时不会做的题都写一下. 题意 从2到n(500)这些数字中,选若干分给A,若干分给B,满足不存在:A的某个数和B的某个数的GCD不等于1. 对于寿司晚宴这题,标准解 ...
- bzoj 4199 [NOI2015]寿司晚宴
Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不同 ...
- [BZOJ]4197: [Noi2015]寿司晚宴
Time Limit: 10 Sec Memory Limit: 512 MB Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NO ...
随机推荐
- Windows系统环境变量之path环境变量(Java, Python环境变量配置)
系统: Windows10 path系统环境变量的作用: Windows和DOS操作系统中的path环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外 ...
- NIO - Buffer
NIO —— Buffer源码分析 Buffer的类结构 底层的基础类是抽象类-Buffer,其中定义了四个变量:capacity(容量),limit(限制),position(位置),mark(标记 ...
- python3之三级菜单
city = { "江苏省": { "南京市": { "栖霞区": ["aa", "bb"], &q ...
- Hyperledger Fabric MSP Identity Validity Rules——MSP身份验证规则
MSP Identity Validity Rules——MSP身份验证规则 正如Hyperledger Fabric Membership Service Providers (MSP)——成员服务 ...
- Python3入门机器学习 - k近邻算法
邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代 ...
- Python函数式编程中map()、reduce()和filter()函数的用法
Python中map().reduce()和filter()三个函数均是应用于序列的内置函数,分别对序列进行遍历.递归计算以及过滤操作.这三个内置函数在实际使用过程中常常和“行内函数”lambda函数 ...
- 微信公众号开发笔记1(nodejs开发)
本篇记录了微信公众号开发的一些笔记 一.微信服务器与我们服务器的交流 微信开发者拥有自己的服务器,在我们服务器上可以与微信服务器进行交流.既然可以交流,那就必定需要前提条件(微信认证),也就是说,只有 ...
- [2017BUAA软工]结对项目
软工结对项目 一. Github项目地址 https://github.com/crvz6182/sudoku_partner 二. PSP表格 Psp personal software progr ...
- 在Windows下制作静态库和动态库
一:静态库的创建 VC++6.0中new一个的为win32 static library工程,之后有二个选项.根据需求选吧. 具体的类或者函数的添加过程和标准的工程一样,直接创建新的类或者添加新 的. ...
- struts2返回List json
利用struts2-json-plugin 之前一直输出null.... 按网上的配也不行 后来不知道怎么突然可以了 赶紧记录一下 private List<Shop> moneyshop ...