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. 转 java中static{}语句块详解

    原文地址:http://blog.csdn.net/lubiaopan/article/details/4802430     感谢原作者! static{}(即static块),会在类被加载的时候执 ...

  2. Android九宫格界面实现点击每个格点击跳转界面

    刚开始有个任务就是做一个九宫格界面,后来有个任务就是实现点击每个格并跳转界面实现每个格的功能.下面我就介绍一下我是如何实现该功能的 首先写一下我的想法是: 登录成功后显示一个九宫格界面,每个九宫格的每 ...

  3. 关于iOS和OS X废弃的API知识点

    今天在查看苹果接口文档时,突然对于接口的声明知识点比较感兴趣,再网络找到下面这个比较不错的文章,记录一下并分享: 如你所知,已废弃(Deprecated)的API指的是那些已经过时的并且在将来某个时间 ...

  4. C语言中的复合类型

    复合类型 一.掌握的类型 1. 指针数组 int * arr[10]; //arr是一个数组,有10个元素,每个元素都是一个指针,即arr是一个指针数组 int a,b,c,d; arr[0] = & ...

  5. AngularJS 指令

    AngularJS 指令 AngularJS 指令是扩展的 HTML 属性,带有前缀 ng-. ng-app 指令 ng-app 指令定义了 AngularJS 应用程序的 根元素. ng-app 指 ...

  6. Linux 执行partprobe命令时遇到Unable to open /dev/sr0 read-write (Read-only file system)

    在使用fdisk创建分区时,我们会使用partprobe命令可以使kernel重新读取分区信息,从而避免重启系统,但是有时候会遇到下面错误信息"Warning: Unable to open ...

  7. plsql 查询结果窗口 不正常

    今天发现了一个很有趣的现象,一个查询语句查出来的结果窗口只显示一部分. 是因为查询语句中有全角的字符或者空格: 如果是sqlServer的话直接就报错了,而plsql不报错,显示如下

  8. mvc razor中renderPartial,RenderAction,Partial,Action的使用选择

    RenderPartial: 通常被用来显示一个功能相对独立的“块”,比如说显示菜单或者导航条. RenderPartial输出的结果被作为调用的View的一部分显示. 这个方法会直接将结果写入到当前 ...

  9. IE下innerText与FoxFire下textContent属性的不同

    <div> 我是中国 人 我<br/>爱 自己 的<div>祖国</div>. <div> IE下输出 我是中国 人 我 爱 自己 的 祖国 ...

  10. 简易的GCC图形界面GCCUI

    这个 GCCUI.EXE 是配合上一篇博文<用VC6开发嵌入式LINUX程序>说的:用VC6辅助开发LINUX程序的时候使用.把 gcc 编译器增加一个简易的图形界面,可以自动读取 vc6 ...