Description

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

在晚宴上,主办方为大家提供了 n−1 种不同的寿司,编号 1,2,3,…,n−1,其中第 i 种寿司的美味度为 i+1 (即寿司的美味度为从 2 到 n)。
现在小 G 和小 W 希望每人选一些寿司种类来品尝,他们规定一种品尝方案为不和谐的当且仅当:小 G 品尝的寿司种类中存在一种美味度为 x 的寿司,小 W 品尝的寿司中存在一种美味度为 y 的寿司,而 x 与 y 不互质。
现在小 G 和小 W 希望统计一共有多少种和谐的品尝寿司的方案(对给定的正整数 p 取模)。注意一个人可以不吃任何寿司。

Input

输入文件的第 1 行包含 2 个正整数 n,p,中间用单个空格隔开,表示共有 n 种寿司,最终和谐的方案数要对 p 取模。

Output

输出一行包含 1 个整数,表示所求的方案模 p 的结果。

Sample Input

3 10000

Sample Output

9

HINT

2≤n≤500

0<p≤1000000000
 
题解:
两人拥有的寿司美味度的质因子数不能有重复,对于小于√500的质因子将其在G手中、在W手中、不在两人手中压缩成3进制状态j,用dp[j]储存方案数。
先预处理好美味度为小于√500的质数的寿司归属,在枚举其他寿司插入。
插入一个大于√500的质数寿司P时,同时考虑其倍数。新开一个数组dp2[0~2,j]表示该质因子不在二人手中、在G手中、在W手中时,状态为j的方案数
将P的倍数寿司插入,假设其为KP,通过三个数组转移。
注意转移时该质因子归属、小于√500质因子归属的变化(若K的某个质因子p已在对方手中,则不可拥有;若两人都不拥有,则可以拥有这个寿司,并更新状态;若p质因子已在自己手中,则可以拥有这个寿司)
转移方向:0——>1、2;   1——>1;   2——>2
用所有P的倍数插入并转移后,将dp2[1~2]数组转到dp数组中。
插入质因子都在√500以内的合数寿司时,用类似方法在DP数组中转移。
最后统计答案。
 
代码:
 uses math;
const
zs:array[..]of longint=(,,,,,,,);
var
i,ii,j,jj,k,l,fl,n:longint;
a:array[..]of int64;
b:array[..]of int64;
dp:array[..]of int64;
dp2:array[..,..]of int64;
ans,tj,mo:int64;
begin
readln(n,mo);
b[]:=; for i:= to do b[i]:=b[i-]*;
for i:= to b[]- do dp[i]:=;
for i:= to n do
if a[i]= then
begin
j:=i*;
while j<=n do
begin
if i> then a[j]:= else a[j]:=max(a[j],);
j:=j+i;
end;
if i> then
begin
for j:= to b[]- do
begin
dp2[,j]:=dp[j]; dp2[,j]:=; dp2[,j]:=;
end;
ii:=i; k:=;
while ii<=n do
begin
for jj:= to do
for j:=b[]- downto do
if dp2[jj,j]> then
begin
tj:=j; fl:=;
for l:= to do
if k mod zs[l]= then
begin
if (tj div b[l-])mod =-jj then
begin fl:=; break; end else
tj:=tj+(jj-(tj div b[l-])mod )*b[l-];
end;
if fl= then dp2[jj,tj]:=(dp2[jj,tj]+dp2[jj,j])mod mo;
end;
for j:=b[]- downto do
begin
for jj:= to do
begin
tj:=j; fl:=;
for l:= to do
if k mod zs[l]= then
begin
if (tj div b[l-])mod =-jj then
begin fl:=; break; end else
tj:=tj+(jj-(tj div b[l-])mod )*b[l-];
end;
if fl= then dp2[jj,tj]:=(dp2[jj,tj]+dp2[,j])mod mo;
end;
end;
ii:=ii+i; inc(k);
end;
for j:= to b[]- do dp[j]:=(dp[j]+dp2[,j]+dp2[,j])mod mo;
end;
end else
if a[i]= then
begin
for j:=b[]- downto do
begin
for jj:= to do
begin
tj:=j; fl:=;
for l:= to do
if i mod zs[l]= then
begin
if (tj div b[l-])mod =-jj then
begin fl:=; break; end else
tj:=tj+(jj-(tj div b[l-])mod )*b[l-];
end;
if fl= then dp[tj]:=(dp[tj]+dp[j])mod mo;
end;
end;
end;
for i:= to b[]- do
begin
fl:=;
for l:= to do
if(zs[l]>n)and((i div b[l-])mod <>)then
begin fl:=; break; end;
if fl= then ans:=(ans+dp[i])mod mo;
end;
writeln(ans);
end.

BZOJ4197[NOI2005]寿司晚宴的更多相关文章

  1. [UOJ#129][BZOJ4197][Noi2015]寿司晚宴

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

  2. 【BZOJ-4197】寿司晚宴 状压DP

    4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 694  Solved: 440[Submit][Status] ...

  3. [BZOJ4197][Noi2015]寿司晚宴

    4197: [Noi2015]寿司晚宴 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 412  Solved: 279[Submit][Status] ...

  4. [NOI2005]寿司晚宴

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

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

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

  6. bzoj4197 [Noi2015]寿司晚宴——状压DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4197 首先,两个人选的数都互质可以看作是一个人选了一个数,就相当于选了一个质因数集合,另一个 ...

  7. 【BZOJ4197】【NOI2015】寿司晚宴(动态规划)

    [BZOJ4197][NOI2015]寿司晚宴(动态规划) 题面 BZOJ 从\([2,n]\)中选择两个集合(可以为空集),使得两个集合中各选一个数出来,都互质. 求方案数. 题解 对于\(500\ ...

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

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

  9. 【BZOJ4197】【Noi2015】寿司晚宴

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

随机推荐

  1. Double 数据保留两位小数二:直接截取小数后面两位,不进行四舍五入

    package com; public class T2 { public static void main(String[] args) { System.out.println(calculate ...

  2. ios git 终端提交

    git status    //检查提交状态 git status On branch master  //检查分支 git branch   //查看分支 git add *   //添加所有本地更 ...

  3. linux下 yum 安装mysql和卸载

    1.查看有没有安装过: yum list installed mysql* rpm -qa | grep mysql* 2.查看有没有安装包: yum list mysql* 3.安装mysql客户端 ...

  4. Selenium Test 自动化测试 入门级学习笔记

    1.下载安装Firefox-selenium插件 需要下载插件可以联系,这里暂不提供下载地址. 2.集成Eclipse 需要下载jar包可以联系,这里暂不提供下载地址. 集成Eclipse非常简单,加 ...

  5. symfony2 路由工作原理及配置

    1.路由是程序的方法和URL的一一映射.

  6. Sublime Text 收藏笔记

    Sublime Text:初学者不知道的那些事 转载自: http://blog.jobbole.com/23949/

  7. Java注解一谈

    阅读目录 1.元注解 2.自定义注解 3.注解处理器 android注解框架解析 我们经常会在java代码里面看到:“@Override”,“@Target”等等样子的东西,这些是什么? 在java里 ...

  8. pentaho cde数据联动,下拉框,文本框,图形

    先看一下效果: 开源bi工具pentaho数据联动,和传统意义上的更改数据不同,pentaho cde 需要一个监听来动态传值. 说一下需要注意的几个地方吧 1.参数是不能在两个图表中直接传递的,必须 ...

  9. iOS UIAlertView添加输入框

    这玩意有时不用就忘,还是记录一下吧 添加: UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"新建文件夹" mes ...

  10. 深入理解linux系统的目录结构(总结的非常详细)

    对于每一个Linux学习者来说,了解Linux文件系统的目录结构,是学好Linux的至关重要的一步.,深入了解linux文件目录结构的标准和每个目录的详细功能,对于我们用好linux系统只管重要,下面 ...