壽司晚宴(dinner)

2021-07-05 13:43:50 字數 1687 閱讀 7886

時間限制: 1 sec 記憶體限制: 512 mb

題目描述

為了慶祝 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 取模)。注意乙個人可以不吃任何壽司。

輸入

輸入檔案的第 1 行包含 2 個正整數 n,p,中間用單個空格隔開,表示共有 n 種壽司,最終和諧的方案數要對 p 取模。

輸出

輸出一行包含 1 個整數,表示所求的方案模 p 的結果。

樣例輸入一

3 10000

樣例輸入二

4 10000

樣例輸入三

100 100000000

樣例輸出一

9樣例輸出二

21樣例輸出三

3107203

資料範圍

2<=n<=500

1<=p<=1000000000

對於每個數字,最多只有乙個質因子大於根號500,而小於根號500的質數只有8個,可以狀壓處理。所以定義狀態f[i][j],表示第乙個人選擇的數字的狀態為i,第二個人為j的方案數。一類數只能被乙個人選擇,或沒被人選擇,所以可以把f[i][j]拆成g[i][j],h[i][j],分別表示每個人選擇這一類數後,狀態為i,j的答案,進行dp。對於大於根號500的部分,可以把質數大小相同的統一處理。

考慮轉移,對於每一類數,g[i][j]=(g[i][j]+g[i|s[i]][j])%p,h[i][j]=(h[i][j]+h[i][j|s[i]])%p。f[i][j]=h[i][j]+g[i][j]-f[i][j],因為兩個人都不選的情況被g和h重複計算,所以要減去。

#include

#include

#include

#include

#include

#include

#include

#define s 256

#define n 510

using

namespace

std;

const

int num=;

int n,p,ans,f[s][s],g[n][n],h[n][n];

struct node

t[i].tmp=x;

} sort(t+2,t+n+1);f[0][0]=1;

for(int i=2;i<=n;i++)

if(t[i].tmp!=t[i+1].tmp||t[i].tmp==1)

NOI 2015 壽司晚宴

description 為了慶祝 noi 的成功開幕,主辦方為大家準備了一場壽司晚宴。小 g 和小 w 作為參加 noi 的選手,也被邀請參加了壽司晚宴。在晚宴上,主辦方為大家提供了 n 1 種不同的壽司,編號 1,2,3,n 1,其中第 i 種壽司的美味度為 i 1 即壽司的美味度為從 2 到 n...

NOI 2015 壽司晚宴

4197 noi2015 壽司晚宴 time limit 10 sec memory limit 512 mb submit 813 solved 508 submit status discuss description 為了慶祝 noi 的成功開幕,主辦方為大家準備了一場壽司晚宴。小 g 和小 ...

NOI2015 壽司晚宴

題目 這是一篇需要龜速乘的思博題解 我們考慮一下 n leq 30 的睿智暴力,顯然質因數個數少得一批,互質的條件又等價於沒有公共的質因子,所以我們直接狀壓質因子,dp i s 1 s 2 表示前 i 個數考慮完了,第乙個人選擇的質因子狀態為 s 1 第二個人選擇的質因子狀態為 s 2 轉移的話就考...