传送门


数论题\(n \leq 500\)肯定是什么暴力算法……

注意到每一个数\(> \sqrt{n}\)的因子最多只有一个,这意味着\(> \sqrt{n}\)的因子之间是独立的,而只有\(\leq \sqrt{n}\)的因子之间会相互影响。而\(\leq \sqrt{n}\)的因子只有\(2,3,5,7,11,13,17,19\)总共\(8\)个,所以可以大力状压。

将\(2-n\)之间的所有数质因数分解,记录其中\(<\sqrt{n}\)的因子的出现情况,按照\(> \sqrt{n}\)的因子分类,一组一组地加入并DP。设\(dp_{i,j,k}\)表示第一个人拥有的寿司中\(<\sqrt{n}\)的因子存在情况为\(i\),第二个人拥有的寿司中\(<\sqrt{n}\)的因子存在情况为\(j\),当前计算的\(> \sqrt{n}\)的因子的存在情况为\(k\)时的方案数,转移看当前寿司分给第一个人还是第二个人。没有\(> \sqrt{n}\)因子的数先单独做一次。

总复杂度\(O(3^8n)\)

#include<iostream>
#include<cstdio>
#include<vector>
//This code is written by Itst
using namespace std;

#define int long long
const int prm[] = {2,3,5,7,11,13,17,19};
int dp[1 << 8][1 << 8][3] , N , MOD;
vector < int > Max[507];

signed main(){
#ifndef ONLINE_JUDGE
    freopen("in","r",stdin);
    //freopen("out","w",stdout);
#endif
    cin >> N >> MOD;
    for(int i = 2 ; i <= N ; ++i){
        int all = 0 , x = i;
        for(int j = 7 ; j >= 0 ; --j){
            all <<= 1;
            if(x % prm[j] == 0){
                while(x % prm[j] == 0)
                    x /= prm[j];
                ++all;
            }
        }
        Max[x].push_back(all);
    }
    dp[0][0][0] = 1;
    for(auto t : Max[1])
        for(int i = (1 << 8) - 1 ; i >= 0 ; --i){
            int s = ((1 << 8) - 1) ^ i , k = s;
            while(1){
                if(!(i & t))
                    dp[i][k | t][0] = (dp[i][k | t][0] + dp[i][k][0]) % MOD;
                if(!(k & t))
                    dp[i | t][k][0] = (dp[i | t][k][0] + dp[i][k][0]) % MOD;
                if(!k) break;
                k = (k - 1) & s;
            }
        }
    for(int p = 2 ; p <= N ; ++p)
        if(!Max[p].empty()){
            for(auto t : Max[p]){
                for(int i = (1 << 8) - 1 ; i >= 0 ; --i){
                    int s = ((1 << 8) - 1) ^ i , k = s;
                    while(1){
                        if(!(i & t))
                            dp[i][k | t][1] = (dp[i][k | t][1] + dp[i][k][0] + dp[i][k][1]) % MOD;
                        if(!(k & t))
                            dp[i | t][k][2] = (dp[i | t][k][2] + dp[i][k][0] + dp[i][k][2]) % MOD;
                        if(!k) break;
                        k = (k - 1) & s;
                    }
                }
            }
            for(int i = (1 << 8) - 1 ; i >= 0 ; --i){
                int s = ((1 << 8) - 1) ^ i , k = s;
                while(1){
                    dp[i][k][0] = (dp[i][k][0] + dp[i][k][1] + dp[i][k][2]) % MOD;
                    dp[i][k][1] = dp[i][k][2] = 0;
                    if(!k) break;
                    k = (k - 1) & s;
                }
            }
        }
    int sum = 0;
    for(int i = (1 << 8) - 1 ; i >= 0 ; --i){
        int s = ((1 << 8) - 1) ^ i , k = s;
        while(1){
            sum = (sum + dp[i][k][0]) % MOD;
            if(!k) break;
            k = (k - 1) & s;
        }
    }
    cout << sum;
    return 0;
}

UOJ129 NOI2015 寿司晚宴 数论、状压DP的更多相关文章

  1. UOJ #129 / BZOJ 4197 / 洛谷 P2150 - [NOI2015]寿司晚宴 (状压dp+数论+容斥)

    题面传送门 题意: 你有一个集合 \(S={2,3,\dots,n}\) 你要选择两个集合 \(A\) 和 \(B\),满足: \(A \subseteq S\),\(B \subseteq S\), ...

  2. [NOI2015]寿司晚宴(状压dp)

    为了庆祝NOI的成功开幕,主办方为大家准备了一场寿司晚宴.小G和小W作为参加NOI的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了n−1种不同的寿司,编号1,2,3,⋯,n-1,其中第种 ...

  3. bzoj 4197: [Noi2015]寿司晚宴【状压dp】

    一个数内可能多个的质因数只有小于根号n的,500内这样的数只有8个,所以考虑状压 把2~n的数处理出小于根号500的质因数集压成s,以及大质数p(没有就是1),然后按p排序 根据题目要求,拥有一个质因 ...

  4. BZOJ4197 [Noi2015]寿司晚宴 【状压dp】

    题目链接 BZOJ4197 题解 两个人选的数都互质,意味着两个人选择了没有交集的质因子集合 容易想到将两个人所选的质因子集合作为状态\(dp\) \(n\)以内质数很多,但容易发现\(\sqrt{n ...

  5. 【Luogu】P2150寿司晚宴(状压DP)

    题目链接 反正……我是没什么想法了,全程看题解 (或者说自己想了半天错解) 因为大于根n的质数最多只会在一个数里出现一种,所以可以把数拆成两部分:小数的二进制集合和大数. 然后把大数一样的放到一起DP ...

  6. 【bzoj4903/uoj300】[CTSC2017]吉夫特 数论+状压dp

    题目描述 给出一个长度为 $n$ 的序列,求所有长度大于等于2的子序列个数,满足:对于子序列中任意两个相邻的数 $a$ 和 $b$ ($a$ 在 $b$ 前面),${a\choose b}\mod 2 ...

  7. BZOJ4197 / UOJ129 [Noi2015]寿司晚宴

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000 作者博客:http://www.cnblogs.com/ljh2000-jump/ ...

  8. [NOI2015]寿司晚宴 --- 状压DP

    [NOI2015]寿司晚宴 题目描述 为了庆祝NOI的成功开幕,主办方为大家准备了一场寿司晚宴. 小G和小W作为参加NOI的选手,也被邀请参加了寿司晚宴. 在晚宴上,主办方为大家提供了n−1种不同的寿 ...

  9. 【BZOJ4197】[Noi2015]寿司晚宴 状压DP+分解质因数

    [BZOJ4197][Noi2015]寿司晚宴 Description 为了庆祝 NOI 的成功开幕,主办方为大家准备了一场寿司晚宴.小 G 和小 W 作为参加 NOI 的选手,也被邀请参加了寿司晚宴 ...

随机推荐

  1. 克拉克拉(KilaKila):大规模实时计算平台架构实战

    克拉克拉(KilaKila):大规模实时计算平台架构实战 一.产品背景:克拉克拉(KilaKila)是国内专注二次元.主打年轻用户的娱乐互动内容社区软件.KilaKila推出互动语音直播.短视频配音. ...

  2. 什么是DevOps?

    一. 什么是DevOps 是什么? DevOps (英文 Development 和 Operations 的组合)是一组过程.方法与系统的统称,用于促进开发(应用程序 / 软件工程).技术运营和质量 ...

  3. 痞子衡嵌入式:飞思卡尔i.MX RT系列MCU启动那些事(2)- Boot配置(BOOT Pin/eFUSE)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是飞思卡尔i.MX RT系列MCU的Boot配置. 在上一篇文章 Boot简介 里痞子衡为大家介绍了Boot基本原理以及i.MXRT Bo ...

  4. js for循环删除两个数组相同元素

    var id = ['a','b','c','a','d','a','a','b','d','c','a','b','c','a','b','c'] var del = ['a','c']; var ...

  5. 基于.Net进行前端开发的技术栈发展路线(二)

    前言 上一篇<我的技能树>文章分享了我的技能成长过程,还未完成,今天继续跟大家分享. 01 我的技能树 我的当前的技能树: 其中,标注为黄色旗帜的是基本掌握,标注为红色旗帜的为使用熟练.未 ...

  6. 第29章 保护API - Identity Server 4 中文文档(v1.0.0)

    IdentityServer 默认以JWT(JSON Web令牌)格式发出访问令牌. 今天的每个相关平台都支持验证JWT令牌,这里可以找到一个很好的JWT库列表.热门库例如: ASP.NET Core ...

  7. Nginx 初識

    今天簡單了解了一下Nginx,并在本機安裝,并簡單配置了一下,道理什麼的還不懂,就是看能不能跑起來. 1.安裝從官網下載就好,把文件隨便解壓在一個英文目錄裡面. 然後修改配置文件,修改的內容如下: 2 ...

  8. create-react-app 修改项目端口号及ip,设置代理

    项目相关配置,需要在package.json中配置

  9. 2019-01-28 [日常]Beyond的歌里最多是"唏嘘"吗? - Python分词+词频

    看了一个Beyond的纪录片, 提到这个. 觉得心有不甘, 于是搜集了24首歌词, 用Python做了简单分词和词频统计. 源码(包括歌词)在: program-in-chinese/study 统计 ...

  10. SAP MM 预留单据里的Base date和Requirement date

    SAP MM 预留单据里的Base date和Requirement date Base date可以在预留创建的初始界面指定, 这个日期可以作为预留各个行项目默认的requirement date. ...