洛谷 P2150 [NOI2015] 寿司晚宴

P2150 [NOI2015] 寿司晚宴

1

约定: n ≤ 500 n \leq 500 n500

题意

给定 2 → n 2 \rightarrow n 2n n − 1 n-1 n1 个数字,现在两个人想分别取一些数字(不一定全取完),如果他们两人取的数字中存在: x ∈ A , y ∈ B x \in A,y \in B xA,yB,但 x x x y y y 不互质,那么这种方案不和谐

给出和谐方案的总数

思路

两个人取的数字要互相互质,那么对于 ∀ x ∈ A , y ∈ B \forall x \in A, y \in B xA,yB,有 x x x y y y 一定没有相同的质因子,而 n ≤ 500 n \leq 500 n500 的质数有限,我们可以这样设计: d p [ i ] [ S 1 ] [ S 2 ] dp[i][S_1][S_2] dp[i][S1][S2] 为处理完第 i i i 个数字后,第一个集合拥有的质因子状态为 S 1 S_1 S1,第二个集合拥有的质因子状态为 S 2 S_2 S2 的方案数。

可是小于 500 500 500 的质数太多,我们进一步观察发现:一个数 x x x 最多只有一个大于 x \sqrt x x 的质因子,我们不妨单独处理这个质因子,称其为大质数,而小于 n = 22 \sqrt n = 22 n =22 的质数只有 8 8 8 个: 2 , 3 , 5 , 7 , 11 , 13 , 17 , 19 {2, 3, 5, 7, 11, 13, 17, 19} 2,3,5,7,11,13,17,19

所以我们 D P DP DP 的数组的后面集合状态只需要 1 < < 8 1 << 8 1<<8 大小即可。

用结构体来存每个数 x x x 的信息:大质数 和 小质数集合 S S S。对于拥有相同大质数的一类数 x 1 , x 2 , x 3 . . . x_1, x_2, x_3 ... x1,x2,x3...,如果它们要被选择的话,它们一定是要么全部被 A A A 选,要么全部被 B B B 选,否则两个集合会拥有相同的大质数,会矛盾。

我们可以定义两个数组: d p 1 、 d p 2 dp1、dp2 dp1dp2 分别表示全部放入 A A A 和全部放入 B B B 的方案数。后面在大质数即将变化的时候,累加两个数组的答案然后容斥一下一开始的答案即可。

#include<bits/stdc++.h>
#define fore(i,l,r)	for(int i=(int)(l);i<(int)(r);++i)
#define fi first
#define se second
#define endl '\n'
#define ull unsigned long long
#define ALL(v) v.begin(), v.end()
#define Debug(x, ed) std::cerr << #x << " = " << x << ed;

const int INF=0x3f3f3f3f;
const long long INFLL=1e18;

typedef long long ll;

struct Num{
    int S; //小质数集合
    int P; //大质数
}a[505];

int D[8] = {2, 3, 5, 7, 11, 13, 17, 19};
ll dp[1 << 8][1 << 8];
ll dp1[1 << 8][1 << 8];
ll dp2[1 << 8][1 << 8];
ll mod;

void init(int x){
    int val = x;
    fore(i, 0, 8){
        int d = D[i];
        if(val % d == 0){
            a[x].S |= 1 << i;
            while(val % d == 0) val /= d;
        }
    }
    if(val != 1) a[x].P = val; //大质数
}

void add(ll& a, ll b){
    a += b;
    if(a >= mod) a -= mod;
}

int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cout.tie(nullptr);
    int n;
    std::cin >> n >> mod;
    fore(i, 2, n + 1) init(i);
    std::sort(a + 2, a + n + 1, [](const Num& a, const Num& b){
        return a.P < b.P;
    });
    
    dp[0][0] = 1;
    fore(i, 2, n + 1){
        if(a[i].P != a[i - 1].P || !a[i].P){ //大质数变化或开头
            memcpy(dp1, dp, sizeof(dp));
            memcpy(dp2, dp, sizeof(dp));
        }
        for(int s1 = 255; s1 >= 0; --s1)
            for(int s2 = 255; s2 >= 0; --s2){
                if(s2 & s1) continue;
                if((a[i].S & s2) == 0) add(dp1[s1 | a[i].S][s2], dp1[s1][s2]);
                if((a[i].S & s1) == 0) add(dp2[s1][s2 | a[i].S], dp2[s1][s2]);
            }
        if(a[i].P != a[i + 1].P || !a[i].P || i == n) //大质数即将变化或结尾
            for(int s1 = 255; s1 >= 0; --s1)
                for(int s2 = 255; s2 >= 0; --s2){
                    if(s1 & s2) continue;
                    dp[s1][s2] = (dp1[s1][s2] + dp2[s1][s2] - dp[s1][s2] + mod) % mod;
                } //这里要容斥减去一开始复制dp数组的答案
    }

    ll ans = 0;
    for(int s1 = 255; s1 >= 0; --s1)
        for(int s2 = 255; s2 >= 0; --s2){
            if(s1 & s2) continue;
            add(ans, dp[s1][s2]);
        }

    std::cout << ans;
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/354667.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

05. java线程基础

05. java线程基础 01. 线程相关概念 1. 程序 ​ 是为完成特定任务、用某种语言编写的一组指令的集合。简单来说&#xff1a;就是我们写的代码 2. 进程 进程是指运行中的程序&#xff0c;比如我们使用微信&#xff0c;就启动了一个进程&#xff0c;操作系统会为该进程分配内…

【代码随想录】LC 242. 有效的字母异位词

文章目录 前言一、题目1、原题链接2、题目描述 二、解题报告1、思路分析2、时间复杂度3、代码详解 前言 本专栏文章为《代码随想录》书籍的刷题题解以及读书笔记&#xff0c;如有侵权&#xff0c;立即删除。 一、题目 1、原题链接 242. 有效的字母异位词 2、题目描述 二、解题…

一文理清楚-Docker 容器如何工作

Docker 容器如何工作 集装箱什么是虚拟机&#xff1f;虚拟化如何运作&#xff1f;什么是容器&#xff1f;什么是 Docker&#xff1f;总结 五星上将麦克阿瑟曾经说过&#xff1a;在docker面前&#xff0c;虚拟机就是个弟弟 集装箱 《盒子&#xff1a;集装箱如何让世界变得更小&…

剑指offer——删除链表的节点

题目描述&#xff1a;给定单向链表的头指针和一个要删除的节点的值&#xff0c;定义一个函数删除该节点。返回删除后的链表的头节点。 数据范围&#xff1a; 0 <链表节点值 < 10000 0 <链表长度 < 10000 示例1&#xff1a; 输入&#xff1a;{2,5,1,9}&#xff…

1.28寒假集训

A: 解题思路&#xff1a; 移项就好v mv / (M - m) 下面是c代码&#xff1a; #include<iostream> using namespace std; int main() {int t;double M,m,v;cin >> t;while(t ! 0){cin >> M >> m >> v;printf("%.2lf\n",(m * v) / (M…

数据库之 基础概念、安装mysql、sql语句基础

数据库之 基础概念、安装mysql、sql语句基础 【一】存储数据的演变过程&#xff1a; 文件存储&#xff1a; 初始阶段随意存放数据到文件&#xff0c;格式任意。目录规范引入&#xff1a; 软件开发使用目录规范&#xff0c;限制数据位置&#xff0c;建立专门文件夹。本地数据存…

Linux报 “no route to host” 异常 ping: sendmsg: No route to host

公司有台服务器迁移机房后跟另一台服务器相互ping不通&#xff0c;但是两台服务器都能上网能ping其他机器&#xff0c;其他机器都能ping通这两台服务器。检查两台服务器没有防火墙规则拦截&#xff0c;交换机上也没检查到acl过滤。 下图是迁移机房的服务器ping截图 下图是nfs服…

分布式空间索引了解与扩展

目录 一、空间索引快速理解 &#xff08;一&#xff09;区域编码 &#xff08;二&#xff09;区域编码检索 &#xff08;三&#xff09;Geohash 编码 &#xff08;四&#xff09;RTree及其变体 二、业内方案选取 三、分布式空间索引架构 &#xff08;一&#xff09;PG数…

腾讯云幻兽帕鲁4核16G14M服务器性能测评和价格

腾讯云幻兽帕鲁服务器4核16G14M配置&#xff0c;14M公网带宽&#xff0c;限制2500GB月流量&#xff0c;系统盘为220GB SSD盘&#xff0c;优惠价格66元1个月&#xff0c;277元3个月&#xff0c;支持4到8个玩家畅玩&#xff0c;地域可选择上海/北京/成都/南京/广州&#xff0c;腾…

通讯录项目(终)

Start And Stick 上一期我们将通讯录的项目的基本功能已经实现&#xff0c;这一篇文章我们将对通讯录进行完善。 目录 Start And Stick 上期回顾&#xff1a; 上期必要代码&#xff1a; 数据打印&#xff1a; 代码讲解&#xff1a; 头部插入数据&#xff1a; 代码讲解&…

27.1K Star,优雅的JSON 数据可视化工具

Hi&#xff0c;骚年&#xff0c;我是大 G&#xff0c;公众号「GitHub指北」会推荐 GitHub 上有趣有用的项目&#xff0c;一分钟 get 一个优秀的开源项目&#xff0c;挖掘开源的价值&#xff0c;欢迎关注。 想自己之前做 APP 开发会访问后端数据&#xff0c;这个数据就是 JSON …

【网络基础】网络协议传输层UDP和TCP

UDP 解包和分用 解包&#xff08;解析数据包&#xff09; 捕获数据包&#xff1a;首先&#xff0c;接收端的网络栈捕获UDP数据包。检查目的端口&#xff1a;接收端检查数据包头部的目的端口&#xff0c;以确定哪个应用程序应该接收该数据包。验证校验和&#xff1a;接收端可能…

【排序5】基数排序:数字的组织与整理艺术

&#x1f3a1;基数排序 &#x1f38a;1、基本思想&#x1f38a;2、基本步骤&#x1f38a;3、代码示例&#x1f38a;4、特性总结 &#x1f38a;1、基本思想 基数排序&#xff08;Radix Sort&#xff09;是一种非比较排序算法&#xff0c;它根据数字的每一位来对元素进行排序。它…

2024年数学建模美赛C题(预测 Wordle)——思路、程序总结分享

1: 问题描述与要求 《纽约时报》要求您对本文件中的结果进行分析&#xff0c;以回答几个问题。 问题1&#xff1a;报告结果的数量每天都在变化。开发一个模型来解释这种变化&#xff0c;并使用您的模型为2023年3月1日报告的结果数量创建一个预测区间。这个词的任何属性是否会…

Java TemporalAdjusters 时间调节器

提供了非常多处理日期相关的函数&#xff1a; 使用示例&#xff1a; /*** JCccc* param args*/public static void main(String[] args) {DateTimeFormatter pattern DateTimeFormatter.ofPattern("yyyy-MM-dd");LocalDateTime now LocalDateTime.now();//获取当月…

web前端项目-实现录音功能【附源码】

录音功能 运行效果&#xff1a;本项目可实现录音软件的录音、存储、播放等功能 HTML源码&#xff1a; &#xff08;1&#xff09;index.html&#xff1a; <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/h…

java日志框架总结(三 、Log4j日志框架)

一、简介 Log4j ( Logger For Java ) , Java 日志的记录包。 官方网站 。Log4j 是 Apache 的一个开源项目&#xff0c; 为Java提供了日志记录功能。能够让程序员非常方便的记录日志&#xff0c; 并且提供了多种适配方式&#xff0c;能满足各种需求。 使用Log4j 只需要导入一个…

【时序预测】2、prophet:Forecasting at Scale | Python 文档教程

文章目录 一、Quick Start二、饱和预测2.1 Forecasting Growth 预测增长2.2 Saturating Minimum 饱和最小值 三、Trend Changepoints 趋势变化点3.1 Automatic changepoint detection in Prophet 自动检测变化点3.2 Adjusting trend flexibility 调整趋势灵活性3.3 Specifying …

从零开始做题:逆向 ret2shellcode orw

1.题目信息 BUUCTF在线评测 下载orw时防病毒要关闭 2.题目分析 orw是open、read、write的简写。有时候binary会通过prctl、seccomp进行沙箱保护&#xff0c;并不能getshell。只能通过orw的方式拿到flag。 fdopen&#xff08;‘./flag’); # 打开flag文件&#xff0c;得到fd…

线程调度(Java Android)

关于作者&#xff1a;CSDN内容合伙人、技术专家&#xff0c; 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 &#xff0c;擅长java后端、移动开发、商业变现、人工智能等&#xff0c;希望大家多多支持。 未经允许不得转载 目录 一、导读二、概览2.1、线程的属性 三、…