【题解】NOI2015寿司晚宴
想好久啊+不敢写啊……但果然人还是应当勇敢自信,只有坚定地去尝试,才会知道最后的结果。1A真的太开心啦,不过好像我的做法还是比较复杂的样子……理解起来应该算是比较容易好懂的类型,大家可以参考一下思路~
首先我们先考虑一下简单的30分算法:30以内的质数只有十个左右,可以利用状压表示出两个人所选择的集合,再通过寿司转移即可。之后的大数据呢?我们发现不能这样做是因为之后的质数越来越多,状压的空间就开不下了。
这时要注意到一个性质:对于1~n内的每一个数而言,都可以分解成若干个<sqrt(n)的质数之积 || 在此基础之上再乘上一个 > sqrt(n)的质数。这说明什么?对于所有的>sqrt(n)的质数而言,我们选择一个寿司只可能选择其中的一个——换句话说,就是不同的大质数之间的决策是相互独立的。
于是就有了如下算法:既然不同的大质数之间不会互相影响,我们就一个一个大质数来统计,之后再累加到一起即可。于是我们增加一维的状态,单独表示这一个大质数。0表示两个集合中均不含有这个大质数因子,1表示第一个人所选择的集合中含这个因子,2表示第二个人选择的集合中含有这个因子。不同的因子之间的转移将所有1&2的状态都加入0并清空1&2即可(对于新的质数来说,之前没有作出过相应的决策,所以是不含有该因子的)。
网上代码很短,然而我莫名长……
#include <bits/stdc++.h>
using namespace std;
#define maxn 1000
#define maxt 260
#define int long long
int n, mod, S[maxn], CNST = ( << ) - ;
int cnt, dp[][maxt][maxt], num[maxn], mark[maxn];
int tot, P[maxn], cnp = , ans;
int pri[maxn] = {, , , , , , , , };
map <int, int> Map; int read()
{
int x = ;
char c;
c = getchar();
while(c < '' || c > '') c = getchar();
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x;
} int up(int &x, int y)
{
x += y;
if(x >= mod) x -= mod;
} void work(int i)
{
for(int x = CNST; ~x; x --)
for(int y = CNST; ~y; y --)
{
if(x & y) continue;
int a = dp[][x][y], b = dp[][x][y];
up(dp[][x | num[i]][y], dp[][x][y]);
up(dp[][x][y | num[i]], dp[][x][y]); up(dp[][x | num[i]][y], a);
up(dp[][x][y | num[i]], b);
}
} void DP(int k)
{
for(int x = ; x <= CNST; x ++)
for(int y = ; y <= CNST; y ++)
if(x & y) continue;
else
{
up(dp[][x][y], dp[][x][y]);
up(dp[][x][y], dp[][x][y]);
dp[][x][y] = dp[][x][y] = ;
}
if(k) for(int i = k; i <= n + ; i += k) work(i);
else
{
for(int i = ; i <= cnt; i ++)
for(int x = CNST; ~x; x --)
for(int y = CNST; ~y; y --)
{
if(x & y) continue;
int k = S[i];
int a = dp[][x][y];
up(dp[][x | num[k]][y], a);
up(dp[][x][y | num[k]], a);
}
}
} signed main()
{
n = read() - , mod = read();
dp[][][] = ;
for(int i = ; i <= n + ; i ++)
{
int k = i;
for(int j = ; j <= cnp; j ++)
{
if(!(k % pri[j])) num[i] |= ( << (j - ));
while(!(k % pri[j])) k /= pri[j];
}
if(k != && k != )
{
mark[i - ] = k;
if(!Map[k]) Map[k] = , P[++ tot] = k;
}
else S[++ cnt] = i;
}
for(int i = ; i <= tot; i ++)
DP(P[i]);
for(int i = ; i <= CNST; i ++)
for(int j = ; j <= CNST; j ++)
if(i & j) continue;
else
{
up(ans, dp[][i][j]);
up(ans, dp[][i][j]);
up(ans, dp[][i][j]);
}
printf("%lld\n", ans);
return ;
}
【题解】NOI2015寿司晚宴的更多相关文章
- 【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 的成功开幕,主办方为大家准备了一场寿 ...
- [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种不同的寿 ...
- BZO4197 & 洛谷2150 & UOJ129:[NOI2015]寿司晚宴——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4197 https://www.luogu.org/problemnew/show/P2150 ht ...
- bzoj 4199 [NOI2015]寿司晚宴
Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不同 ...
- 【bzoj4197】[Noi2015]寿司晚宴 分解质因数+状态压缩dp
题目描述 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了 n−1 种不同的寿司,编号 ...
随机推荐
- web3.js_1.x.x--API(二)/合约部署与事件调用
web3.js_1.x.x的使用和网上查到的官方文档有些不同,我对经常使用到的API进行一些整理,希望能帮到大家 转载博客:http://www.cnblogs.com/baizx/p/7474774 ...
- git克隆出错 github clone Permission denied (publickey) fatal Could not read from remote repo
原文网址:http://blog.csdn.net/feeling450/article/details/53067563 github clone "Permission denied ( ...
- 宝塔漏洞 XSS窃取宝塔面板管理员漏洞 高危
宝塔是近几年刚崛起的一款服务器面板,深受各大站长的喜欢,windows2003 windows2008windosws 2012系统,linux centos deepin debian fedora ...
- ctf题目writeup(5)
2019.2.1 今天继续bugku的隐写杂项题:题目链接:https://ctf.bugku.com/challenges 1. 这道题下载后用wireshark打开...看了好久也没看出个所以然, ...
- POJ3177 边双连通分量
Redundant Paths Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18580 Accepted: 7711 ...
- 42-EF Core Migration
1-常用命令 1-由于2.1版本有点不一样,不会自动创建ApplicationUser类,发现合并没效果.暂时略 增加一个字段 E:\coding\netcore\IdentitySample> ...
- eclipse 关闭validating
1.起因 validating XXX 总是非常的浪费时间,有时候还会造成程序卡死 2.解决 windows - Perferences - Validation build 全部去掉
- 「日常训练」 不容易系列之(3)—— LELE的RPG难题 (HDU 2045)
题目简述 有排成一行的n" role="presentation">nn个方格,用红(Red).粉(Pink).绿(Green)三色涂每个格子,每格涂一色,要求任何 ...
- 使用testng.xml组织测试用例
测试用例类TeseNG.java: import org.openqa.selenium.By;import org.openqa.selenium.WebDriver;import org.open ...
- gitbash避免每次push都输入密码
gitbash每次提交都要输密码真有点头疼,所以就: 1 创建验证文件:touch .git-credentials(windows) 2 编辑验证文件:vim .git-credentials ...