bzoj4197 NOI2015 壽司晚宴

2021-08-09 02:28:44 字數 1892 閱讀 9765

題意

有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 ...