题解

怎么NOI2015D1……全是一眼秒的sb题……然后我代码全都写跪一遍= = 要是NOI2015是IOI赛制我就可以AK啦(大雾)

代码能力直线下降,NOI2018滚粗预定了啊TAT

我是不是要去开码农题啊QAQ

我们发现大于\(\sqrt{N}\)的素数只会在每个数里出现至多1个,而小于\(\sqrt{N}\)的素数只有8个

分别是

2 3 5 7 11 13 17 19

我们对于素因子只有这8个的数先做一遍dp,状态压缩是\(3^8\)每一位分别是0 1 2,表示这个素因子不在任何集合,这个素因子在1集合和这个素因子在2集合

每次判断这个数的素因子如果跨了两个集合就不合法,如果和1集合有交不可以放到2集合,和2集合有交不可以放到1集合

对于包含剩下素数的数,设这个大于\(\sqrt{N}\)的素数为p,按照上述过程做dp,设f[S]为1集合里包含有p作为素因子的数,g[S]为2集合里包含有p作为素因子的数

最后ans[S] = f[S] + g[S] - dp[S](dp[S]是只包含8个素因子的数的方案数)

复杂度\(O(3^8 N)\)

代码

#include <bits/stdc++.h>
//#define ivorysi
#define enter putchar('\n')
#define space putchar(' ')
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define eps 1e-8
#define mo 974711
#define MAXN 100005
#define pii pair<int,int>
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;char c = getchar();T f = 1;
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {putchar('-');x = -x;}
if(x >= 10) {
out(x / 10);
}
putchar('0' + x % 10);
}
bool nonprime[505];
int prime[505],tot;
int dp[2][7006],N,MOD,S[505],rem[505],a[10],b[10],f[2][7006],g[2][7006],s[7006];
int encode(int *a) {
int res = 0;
for(int i = 1 ; i <= 8 ; ++i) {
res = res * 3 + a[i];
}
return res;
}
void decode(int Sta,int *a) {
for(int i = 8 ; i >= 1 ; --i) {
a[i] = Sta % 3;
Sta /= 3;
}
}
int mul(int a,int b) {
return 1LL * a * b % MOD;
}
int inc(int a,int b) {
a = a + b;
if(a >= MOD) a -= MOD;
return a;
}
void update(int &x,int y) {
x = x + y;
if(x >= MOD) x -= MOD;
}
void Init() {
read(N);read(MOD);
for(int i = 2 ; i <= 500 ; ++i) {
if(!nonprime[i]) {
prime[++tot] = i;
for(int j = 2 ; j <= 500 / i ; ++j) nonprime[i * j] = 1;
}
}
}
void Solve() {
for(int i = 2 ; i <= N ; ++i) {
int x = i;
for(int j = 1 ; j <= 8 ; ++j) {
if(x % prime[j] == 0) {
S[i] |= (1 << j - 1);
while(x % prime[j] == 0) x /= prime[j];
}
}
if(x > 1) rem[i] = x;
}
int t = 1;
for(int j = 1 ; j <= 8 ; ++j) t = t * 3;
int cur = 0;
dp[0][0] = 1;
for(int i = 2 ; i <= N ; ++i) {
if(rem[i]) continue;
memset(dp[cur ^ 1],0,sizeof(dp[cur ^ 1]));
for(int j = 0 ; j < t ; ++j) {
if(!dp[cur][j]) continue;
decode(j,a);
int s1 = 0,s2 = 0;
for(int k = 1 ; k <= 8 ; ++k) {
if(a[k] == 1) s1 |= (1 << k - 1);
else if(a[k] == 2) s2 |= (1 << k - 1);
}
update(dp[cur ^ 1][j],dp[cur][j]);
if((s1 & S[i]) && (s2 & S[i])) continue;
if(!(s2 & S[i])) {
memcpy(b,a,sizeof(a));
for(int k = 1 ; k <= 8 ; ++k) {
if(b[k]) continue;
if(S[i] >> (k - 1) & 1) b[k] = 1;
}
update(dp[cur ^ 1][encode(b)],dp[cur][j]);
}
if(!(s1 & S[i])) {
memcpy(b,a,sizeof(a));
for(int k = 1 ; k <= 8 ; ++k) {
if(b[k]) continue;
if(S[i] >> (k - 1) & 1) b[k] = 2;
}
update(dp[cur ^ 1][encode(b)],dp[cur][j]);
}
}
cur ^= 1;
}
int ans = 0;
for(int i = 9 ; i <= tot ; ++i) {
if(N < prime[i]) break;
int c = 0;
memcpy(f[c],dp[cur],sizeof(dp[cur]));
memcpy(g[c],dp[cur],sizeof(dp[cur]));
for(int j = 1 ; j <= N / prime[i] ; ++j) {
memset(f[c ^ 1],0,sizeof(f[c ^ 1]));
memset(g[c ^ 1],0,sizeof(g[c ^ 1]));
for(int k = 0 ; k < t ; ++k) {
decode(k,a);
update(f[c ^ 1][k],f[c][k]);
update(g[c ^ 1][k],g[c][k]);
int s1 = 0,s2 = 0;
for(int h = 1 ; h <= 8 ; ++h) {
if(a[h] == 1) s1 |= (1 << h - 1);
else if(a[h] == 2) s2 |= (1 << h - 1);
}
if((S[j] & s1) && (S[j] & s2)) continue;
if(!(S[j] & s2)) {
memcpy(b,a,sizeof(b));
for(int h = 1 ; h <= 8 ; ++h) {
if(b[h]) continue;
if(S[j] >> (h - 1) & 1) b[h] = 1;
}
update(f[c ^ 1][encode(b)],f[c][k]);
}
if(!(S[j] & s1)) {
memcpy(b,a,sizeof(b));
for(int h = 1 ; h <= 8 ; ++h) {
if(b[h]) continue;
if(S[j] >> (h - 1) & 1) b[h] = 2;
}
update(g[c ^ 1][encode(b)],g[c][k]);
}
}
c ^= 1;
}
for(int k = 0 ; k < t ; ++k) dp[cur][k] = inc(inc(f[c][k],g[c][k]),MOD - dp[cur][k]);
}
for(int k = 0 ; k < t ; ++k) update(ans,dp[cur][k]);
out(ans);enter;
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Init();
Solve();
return 0;
}

【LOJ】#2131. 「NOI2015」寿司晚宴的更多相关文章

  1. LOJ#2131. 「NOI2015」寿司晚宴

    $n \leq 500$,$2-n$这些数字,两个人挑,可以重复挑,问有几种方案中,一个人选的所有数字与另一个人选的所有数字都互质. 不像前两题那么抠脚.. 如果$n$比较小的话,可以把两个人选的数字 ...

  2. 「NOI2015」寿司晚宴 解题报告

    「NOI2015」寿司晚宴 这个题思路其实挺自然的,但是我太傻了...最开始想着钦定一些,结果发现假了.. 首先一个比较套路的事情是状压前8个质数,后面的只会在一个数出现一次的再想办法就好. 然后发现 ...

  3. loj#2129. 「NOI2015」程序自动分析

    题目链接 loj#2129. 「NOI2015」程序自动分析 题解 额... 考你会不会离散化优化常数 代码 #include<queue> #include<cstdio> ...

  4. *LOJ#2134. 「NOI2015」小园丁与老司机

    $n \leq 5e4$个平面上的点,从原点出发,能从当前点向左.右.上.左上或右上到达该方向最近的给定点.问三个问:一.最多经过多少点:二.前一问的方案:三.其所有方案种非左右走的边至少要开几辆挖掘 ...

  5. LOJ#2132. 「NOI2015」荷马史诗

    $n \leq 100000$个数字,放进$k$叉树里,一个点只能放一个数,使所有数字乘以各自深度这个值之和最小的同时,最大深度的数字最小. 哈夫曼.这是我刚学OI那段时间看到的,感觉就是个很无聊的贪 ...

  6. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  7. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  8. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

  9. Loj #3089. 「BJOI2019」奥术神杖

    Loj #3089. 「BJOI2019」奥术神杖 题目描述 Bezorath 大陆抵抗地灾军团入侵的战争进入了僵持的阶段,世世代代生活在 Bezorath 这片大陆的精灵们开始寻找远古时代诸神遗留的 ...

随机推荐

  1. 美化mfc界面,给mfc界面加上皮肤

    注明:里面使用到的资源文件在自己的腾讯微云有. 原图: 添加皮肤后: 通过对比就能知道,加上皮肤后给人的感觉就是耳目一新了. 技术详细说明: 这里用到的是一个轻量型的美化工具SkinSharp又称Sk ...

  2. MSA(微服务简介)

    1.为什么要使用微服务? 要说为什么要使用微服务,我们要先说下传统的企业架构模式-垂直架构/单块架构模式,简单点说:我们一般将系统分为三层架构,但是这是逻辑上的三层,而非物理上的三层,这就意味着经过编 ...

  3. command not found: django-admin.py

    http://www.cnblogs.com/Xjng/p/3559984.html django-admin.py startproject projectname  其中projectname 为 ...

  4. CSS3实现文本垂直排列

    最近的一个项目中要使文字垂直排列,也就是运用了CSS的writing-mode属性. writing-mode最初时ie中支持的一个属性,后来在CSS3中增添了这一新的属性,所以在ie中和其他浏览器中 ...

  5. Win7 32位安装Oracle11g R2 图解示例

    Win7 32位操作系统安装Oracle11g R2 图解示例.废话不说了,直接上图. 1.下载的两个oracle 11gR2压缩包解压到单独的文件夹中. 2.找到解压的database文件夹中的Se ...

  6. CF757 C hash

    一种数字可以变成另一种数,要求每组中变换前后各种数字数量不变,问方案数 对现有每组中的每个数字构造出现在各个组情况的序列,如2 出现在第一组和第二组各一次那么就要加入组别的标号1,2,出现重复次仍要加 ...

  7. Handlerbars基础笔记

    此笔记摘抄于杨元的博客(http://www.cnblogs.com/iyangyuan/archive/2013/12/12/3471227.html) 引入 <script type=&qu ...

  8. 你知道吗?衡量 Web 性能的几个关键指标

    自网站诞生以来,响应速度/响应时间一直都是大家关心的话题,而速度慢乃是网站的一个杀手,正当大家以为四核和宽带能力的提升能够解决这些问题时,Wi-Fi和移动设备为热点移动互联网又悄然兴起. 在2006年 ...

  9. AngularJs几种服务区别

    下面说说这几种函数之间的区别: 函数 定义 适合场景 provider(name, Object OR constructor() ) 一个可配置的.有复杂逻辑的服务.如果你传递了一个对象,那么它应该 ...

  10. 2017ACM暑期多校联合训练 - Team 2 1009 HDU 60563 TrickGCD (容斥公式)

    题目链接 Problem Description You are given an array A , and Zhu wants to know there are how many differe ...