題意
有n−解法1 個數從【2
,n】 ,從中選出兩個集合
s 和
u(可以為
∅ ),要求對於∀x
∈s,∀
y∈u,都有gc
d(x,
y)=1
,求方案總數(n≤
500 )
狀壓dp複雜度: 首先看到互質這一條件,可以想到利用質因子來判斷
很同意證明,對於乙個數
x ,大於x√
的質因子至多有乙個。假設存在兩個及兩個以上大於x√
的質因子:p1
,p2…
…pn ,那麼顯然有∏n
i=1p
i>x ,因此矛盾,得證
那麼我們可以將每個數分解質因數,單獨記錄那個大於x√
的質因子,至於其他因子,我們可以用乙個8位二進位制數表示(因為滿足x≤
500‾‾‾
‾√≈22.3
的質數只有8個),所以就可以設立dp
的狀態: 設f
i,j 表示集合
s 的質因子包含情況為
i,集合
u 的質因子包含情況為
j的方案數,滿足
i &j=
0,gi
,j,0
/1表示集合
s 的質因子包含情況為
i,集合
u 的質因子包含情況為
j,並且那個大於x√
的質因子在
s /
u之中的方案數 fi
,j=g
[i,j
,0]+
gi,j
,1−f
i,j
o(28**∗28∗
n )
#include
#include
#include
#include
#define lint long long int
using
namespace
std;
const
int maxn=(1
<<8)+100;
const
int l=(1
<<8)-1;
struct node
;lint f[maxn][maxn],g[maxn][maxn][2];
lint n,p,ans;
void init()
void write(int x)
int main()
if( x^1 ) t[i].pi=x;
}sort( t+2,t+n+1 );
f[0][0]=1;
for(int i=2;i<=n;i++)
if( t[i].pi!=t[i+1].pi || !t[i].pi )
for(int j=l;j>=0;j--)
for(int k=l;k>=0;k--)
if( !(j&k) ) f[j][k]=(g[j][k][0]+g[j][k][1]-f[j][k])%p;
}for(int i=l;i>=0;i--)
for(int j=l;j>=0;j--)
printf("%lld\n",(ans+p)%p);
return
0;}
BZOJ 4197 Noi2015 壽司晚宴
為了慶祝 noi 的成功開幕,主辦方為大家準備了一場壽司晚宴。小 g 和小 w 作為參加 noi 的選手,也被邀請參加了壽司晚宴。在晚宴上,主辦方為大家提供了 n 1 種不同的壽司,編號 1,2,3,n 1,其中第 i 種壽司的美味度為 i 1 即壽司的美味度為從 2 到 n 現在小 g 和小 w ...
BZOJ4197 NOI2015 壽司晚宴
bzoj luogu 從 2 到 n 中選出兩個不相交子集使得這兩個集合中的任一對元素互質。問總方案數模 mod 的結果。n le500 首先有 30 的部分分是 n le30 考慮到 30 以內的質因數只有 10 個,因此可以狀壓 dp 即設 f s 1 s 2 表示第乙個人選出的質因數集合為 s...
BZOJ4197 Noi2015 壽司晚宴
為了慶祝 noi 的成功開幕,主辦方為大家準備了一場壽司晚宴。小 g 和小 w 作為參加 noi 的選手,也被邀請參加了壽司晚宴。在晚宴上,主辦方為大家提供了 n 1 種不同的壽司,編號 1,2,3,n 1,其中第 i 種壽司的美味度為 i 1 即壽司的美味度為從 2 到 n 現在小 g 和小 w ...