LOJ#2131. 「NOI2015」寿司晚宴
$n \leq 500$,$2-n$这些数字,两个人挑,可以重复挑,问有几种方案中,一个人选的所有数字与另一个人选的所有数字都互质。
不像前两题那么抠脚。。
如果$n$比较小的话,可以把两个人选的数字对应的质因子状压一下,$f(i,j,k)$--前$i$个数,第一个人选状态$j$,第二个人选状态$k$,状态表示质因子。
质因子的根号相关性质:根号n之后的每个质因子最多只会在一个数里出现一次。也就是说,对根号n前面的质因子我们是可能一次选若干种的,但根号n后面的每个质因子每次只能选一种,所以可以单独枚举,再用根号n以前的状态表示。$g(i,j,k)$--前$i$个含质数$p$的数,只让第一个人选,第二个人保持状态$k$的方案数;$h(i,j,k)$--前$i$个含质数$p$的数,只让第二个人选,第一个人保持状态$j$的方案数。如此dp完,$ans(j,k)$表示最后的$f(i,j,k)$,那么$ans(j,k)=g(t,j,k)+h(t,j,k)-ans(j,k)$,其中$t$表示含质因数$p$的数的个数,因为两个人都不选的方案算了两次。
- //#include<iostream>
- #include<cstring>
- #include<cstdio>
- //#include<math.h>
- //#include<set>
- //#include<queue>
- //#include<bitset>
- //#include<vector>
- #include<algorithm>
- #include<stdlib.h>
- using namespace std;
- #define LL long long
- int qread()
- {
- char c; int s=,f=; while ((c=getchar())<'' || c>'') (c=='-') && (f=-);
- do s=s*+c-''; while ((c=getchar())>='' && c<=''); return s*f;
- }
- //Pay attention to '-' , LL and double of qread!!!!
- int n,mod;
- #define maxn 555
- int f[][maxn][maxn],g[][maxn][maxn],h[][maxn][maxn],cur=;
- int prime[maxn],lp,xx[maxn],ss[maxn]; bool notprime[maxn];
- void makeprime()
- {
- ss[]=; ss[]=; ss[]=; ss[]=;
- ss[]=; ss[]=; ss[]=; ss[]=;
- for (int i=;i<=n;i++)
- {
- if (!notprime[i]) {prime[++lp]=i; xx[i]=i;}
- for (int j=,tmp;j<=lp && 1ll*i*prime[j]<=n;j++)
- {
- notprime[tmp=i*prime[j]]=;
- xx[tmp]=prime[j];
- if (!(i%prime[j])) break;
- }
- }
- }
- int num[maxn],len; int S,P;
- void mm(int x)
- {
- len=;
- while (x>) {num[++len]=xx[x]; x/=xx[x];}
- sort(num+,num++len); len=unique(num+,num++len)-num-;
- S=; for (int i=;i<=len;i++) if (num[i]<=) S|=<<ss[num[i]];
- if (num[len]>) P=num[len]; else P=;
- }
- int list[maxn][maxn];
- void play(int &x,int v) {x+=v; x-=x>=mod?mod:;}
- int main()
- {
- n=qread(); mod=qread();
- makeprime();
- for (int i=;i<=n;i++) {mm(i); list[P][++list[P][]]=S;}
- int ts=<<; f[][][]=; cur=;
- for (int i=;i<=list[][];i++)
- {
- int u=list[][i];
- memset(f[cur^],,sizeof(f[cur^]));
- for (int j=;j<ts;j++)
- for (int k=;k<ts;k++) if (f[cur][j][k])
- {
- play(f[cur^][j][k],f[cur][j][k]);
- int nj=j|u; if ((nj&k)==) play(f[cur^][nj][k],f[cur][j][k]);
- int nk=k|u; if ((j&nk)==) play(f[cur^][j][nk],f[cur][j][k]);
- }
- cur^=;
- }
- for (int j=;j<ts;j++)
- for (int k=;k<ts;k++)
- f[][j][k]=f[cur][j][k];
- for (int i=;i<=n;i++) if (!notprime[i])
- {
- cur=;
- for (int j=;j<ts;j++)
- for (int k=;k<ts;k++)
- g[][j][k]=f[][j][k],h[][j][k]=f[][j][k];
- for (int t=;t<=list[i][];t++)
- {
- int u=list[i][t];
- memset(g[cur^],,sizeof(g[cur^]));
- memset(h[cur^],,sizeof(h[cur^]));
- for (int j=;j<ts;j++)
- for (int k=;k<ts;k++) if (g[cur][j][k])
- {
- play(g[cur^][j][k],g[cur][j][k]);
- int nj=j|u; if ((nj&k)==) play(g[cur^][nj][k],g[cur][j][k]);
- }
- for (int j=;j<ts;j++)
- for (int k=;k<ts;k++) if (h[cur][j][k])
- {
- play(h[cur^][j][k],h[cur][j][k]);
- int nk=k|u; if ((j&nk)==) play(h[cur^][j][nk],h[cur][j][k]);
- }
- cur^=;
- }
- for (int j=;j<ts;j++)
- for (int k=;k<ts;k++)
- f[][j][k]=((g[cur][j][k]+h[cur][j][k]-f[][j][k])%mod+mod)%mod;
- }
- int ans=;
- for (int j=;j<ts;j++)
- for (int k=;k<ts;k++)
- play(ans,f[][j][k]);
- printf("%d\n",ans);
- return ;
- }
LOJ#2131. 「NOI2015」寿司晚宴的更多相关文章
- 【LOJ】#2131. 「NOI2015」寿司晚宴
题解 怎么NOI2015D1--全是一眼秒的sb题--然后我代码全都写跪一遍= = 要是NOI2015是IOI赛制我就可以AK啦(大雾) 代码能力直线下降,NOI2018滚粗预定了啊TAT 我是不是要 ...
- 「NOI2015」寿司晚宴 解题报告
「NOI2015」寿司晚宴 这个题思路其实挺自然的,但是我太傻了...最开始想着钦定一些,结果发现假了.. 首先一个比较套路的事情是状压前8个质数,后面的只会在一个数出现一次的再想办法就好. 然后发现 ...
- loj#2129. 「NOI2015」程序自动分析
题目链接 loj#2129. 「NOI2015」程序自动分析 题解 额... 考你会不会离散化优化常数 代码 #include<queue> #include<cstdio> ...
- *LOJ#2134. 「NOI2015」小园丁与老司机
$n \leq 5e4$个平面上的点,从原点出发,能从当前点向左.右.上.左上或右上到达该方向最近的给定点.问三个问:一.最多经过多少点:二.前一问的方案:三.其所有方案种非左右走的边至少要开几辆挖掘 ...
- LOJ#2132. 「NOI2015」荷马史诗
$n \leq 100000$个数字,放进$k$叉树里,一个点只能放一个数,使所有数字乘以各自深度这个值之和最小的同时,最大深度的数字最小. 哈夫曼.这是我刚学OI那段时间看到的,感觉就是个很无聊的贪 ...
- Loj #2192. 「SHOI2014」概率充电器
Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...
- Loj #3096. 「SNOI2019」数论
Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...
- Loj #3093. 「BJOI2019」光线
Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...
- Loj #3089. 「BJOI2019」奥术神杖
Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...
随机推荐
- L2TP用户添加和删除、搜索脚本
#!/bin/bash #author Template . /etc/init.d/functions DATE_TIME=$(date +%F-%T) FILE_PATH='/etc/ppp/ch ...
- JavaScript(E5,6) 正则学习总结学习,可看可不看!
1.概述 正则表达式(实例)是一种表达文本模式(即字符串结构)的方法. 创建方式有两种方式: 一种是使用字面量,以斜杠表示开始和结束. var regex = /xyz/ 另一种是使用RegExp构造 ...
- Node 操作MySql数据库
1, 需要安装 MySQL 依赖 => npm i mysql -D 2, 封装一个工具类 mysql-util.js // 引入 mysql 数据库连接依赖 const mysql = re ...
- psutil模块的基础使用
注:Python并没有自带psutil模块,需要自己去安装 安装psutil模块 pip install psutilorpip3 install psutil 一.导入模块 import psuti ...
- Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
Python中字符串String的基本内置函数与用法 首先我们要明白在python中当字符编码为:UTF-8时,中文在字符串中的占位为3个字节,其余字符为一个字节 下面就直接介绍几种python中字符 ...
- codeforce830A. Office Keys
A. Office Keys time limit per test: 2 seconds memory limit per test: 256 megabytes input standard: i ...
- 用js立即执行函数开发基于bootstrap-multiselect的联动参数菜单
代码调用方式如下: data=[{F0:总分类cd,F1:总分类name,F2:大分类cd,F3:大分类name,F4:中分类cd,F5:中分类name,F6:小分类cd,F7:小分类name},.. ...
- windows控制台主题美化工具-colortool
最近在win10上装了 wsl 系统,发现界面主题太挫,文件夹颜色很不清晰 . 特此在网上搜索了一下,发现了 colortool 这个工具 这是微软官方提供的用于控制台配色的程序 发布版本地址:htt ...
- 设计模式之第6章-迭代器模式(Java实现)
设计模式之第6章-迭代器模式(Java实现) “我已经过时了,就不要讲了吧,现在java自带有迭代器,还有什么好讲的呢?”“虽然已经有了,但是具体细节呢?知道实现机理岂不美哉?”“好吧好吧.”(迭代器 ...
- Mac: mac git 的安装 及实现自动补全
1.检查是否装了brew $ brew list 如果没有,拷贝以下命令到终端 回车.可以安装好brewruby -e "$(curl -fsSL https://raw.githubuse ...