【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 ...
随机推荐
- ubuntu lvm模式进行扩容
ubuntu的16.04 18.04有lvm的功能(安装的时候的选项),能在磁盘空间用完的时候,无缝增加一个磁盘进去.因为linux系统只有一个盘,所以是非常方便,不会有windows加1个磁盘要进行 ...
- 《杜增强讲Unity之Tanks坦克大战》8-子弹碰撞处理
8 子弹碰撞处理 为了处理子弹打到坦克的伤害我们在这里新建一个Shell.cs 子弹有两种情况,碰到坦克炸开,没有碰到坦克则过2s子弹销毁. void Start () { Destroy (game ...
- Python 循环的技巧
当在字典中循环时,用 items() 方法可将关键字和对应的值同时取出 >>> knights = {'gallahad': 'the pure', 'robin': 'the br ...
- CentOS7上部署ASP.Net Core 2.2应用
前言 在CentOS7上部署ASP.Net Core应用是我的技术路线验证的一部分,下一个产品计划采用ASP.Net Boilerplate Framework开发.因此需要求提前进行一下技术验证,在 ...
- [leetcode]从中序与后序/前序遍历序列构造二叉树
从中序与后序遍历序列构造二叉树 根据一棵树的中序遍历与后序遍历构造二叉树. 注意: 你可以假设树中没有重复的元素. 例如,给出 中序遍历 inorder = [9,3,15,20,7] 后序遍历 po ...
- javascript实现对html便签等字符的转义
参考链接:https://www.jb51.net/article/152700.htm 请访问以上链接. 本人纯搬迁,防止原作者删除. <script> var HtmlUtil = { ...
- 如何在多机架(rack)配置环境中部署cassandra节点
cassandra节点上数据的分布和存储是由系统自动完成的.除了我们要设计好partition key之外,在多机架(rack)配置环境中部署cassandra节点,也需要考虑cassandra分布数 ...
- 【推荐系统】neural_collaborative_filtering(源码解析)
很久没看推荐系统相关的论文了,最近发现一篇2017年的论文,感觉不错. 原始论文 https://arxiv.org/pdf/1708.05031.pdf 网上有翻译了 https://www.cnb ...
- MySql 赋值操作符"="与":="
MySql小点心—1.赋值操作符"="与":=" 对于刚接触到mysql的程序员来说,会对这两个符号有疑问,因为会发现有的代码里用这个有的用另一个. 当然他们是 ...
- 钉钉开发c#帮助类 获取用户信息 DingHelper.cs
using System;using System.Collections.Generic;using System.Configuration;using System.Linq;using Sys ...