4197: [noi2015]壽司晚宴
time limit: 10 sec memory limit: 512 mb
submit: 813 solved: 508
[submit][status][discuss]
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
題解:可以發現,選了乙個數等於是選了它的質因子。首先n只有500,所以小於根號500的質因子只有8個。我們可以把這8個質因子壓成二進位制位,形成2^8個集合。對於每個數,只可能含有不超過1個大於根號500的質因子,我們按這個將每個數分類。
把每個數存到乙個結構體s裡,s.kind表示這個數里大於根號500的質因子是什麼,沒有的話為1,s.se表示這個數小於根號500的質因子的包含情況,用二進位制位壓一下。
然後我們按kind排序。dp即可。
dp的時候把kind相同的放在一起dp。
設f[i][j]表示第乙個人選了i這個質因數集合,第二個人選了j這個質因數集合的方案數。
對於每一類數開始dp時。先把f陣列複製兩遍到p[1]和p[2];
p[i][j][k]表示當前是第i個人進行操作,第1個人選的集合是j第二個人是k的方案數。
用p陣列進行更新。
dp結束後要用p陣列更新f陣列。f=p1+p2-f; 因為兩個p陣列中都包含了選當前數的情況,然而這顯然是不可以的,所以要減去之前的f。
**唉感覺自己好菜
【**】
#include
#include
#include
#include
#define fo(i,j,k) for(i=j;i<=k;i++)
using
namespace
std;
int f[515][515],p[3][515][515],q,n,ans;
int pri[8]=;
struct node s[515];
inline
bool comp(const node &x,const node &y)
s[i].kind=tmp;
}sort(s+2,s+n+1,comp);
f[0][0]=1;
fo(i,2,n)
for(j=255;j>=0;j--) for(k=255;k>=0;k--) if((j&k)==0)
if(s[i].kind==1||s[i].kind!=s[i+1].kind)
} fo(j,0,255) fo(k,0,255) if((j&k)==0) ans=(ans+f[j][k])%q;
printf("%d\n",ans);
return
0;}
NOI 2015 壽司晚宴
description 為了慶祝 noi 的成功開幕,主辦方為大家準備了一場壽司晚宴。小 g 和小 w 作為參加 noi 的選手,也被邀請參加了壽司晚宴。在晚宴上,主辦方為大家提供了 n 1 種不同的壽司,編號 1,2,3,n 1,其中第 i 種壽司的美味度為 i 1 即壽司的美味度為從 2 到 n...
NOI2015 壽司晚宴
題目 這是一篇需要龜速乘的思博題解 我們考慮一下 n leq 30 的睿智暴力,顯然質因數個數少得一批,互質的條件又等價於沒有公共的質因子,所以我們直接狀壓質因子,dp i s 1 s 2 表示前 i 個數考慮完了,第乙個人選擇的質因子狀態為 s 1 第二個人選擇的質因子狀態為 s 2 轉移的話就考...
NOI2015 壽司晚宴
嘟嘟嘟 昨天模擬t2 lba和dukelv都說和這題特別像 然而他倆還是沒做出來hhhh 我今天一看,果不其然,大體思路都一樣。但自認為這題比模擬題要難一些,自己也是因為沒有徹底理解浪debug了半天,導致費了很長時間。當 n leqslant 30 時,因為質數只有最多10個,所以可以狀壓每乙個數...