nssl1522 簡單數數題 dp

2021-10-09 09:40:00 字數 1415 閱讀 2478

n

nn個數的乙個集合,求乙個有多少個子集使得這個子集的所有子集的權值和的和是m

mm的倍數

考慮dp,選中集合中每乙個數的貢獻次數是2∣s

∣−12^

2∣s∣−1

,設f i,

j,kf_

fi,j,k

​表示選到第i

ii,現在選了j

jj個數,摸上m

mm的餘數是k

kk。顯然這個無法通過

考慮對m

mm進行分類,如果m

mm是乙個偶數,那麼加入乙個新元素時,相當於整個集合(包括以後加入的)都得乘以2

22,那麼我們可以讓m/2

m/2m/

2即可。

如果m

mm是乙個奇數,那麼考慮總和sum

sumsu

m如果sum

%m≠0

sum\% m\neq 0

sum%m

​=0那麼顯然sum

∗2k≠

0(k∈

n)

sum*2_\neq 0(k\in n)

sum∗2k

​​=

0(k∈

n)。然後我們可以發現j

jj的上界就是m

mm擁有的2

22質因子個數,如果再大那麼顯然沒有意義。

而k

kk的上界是m2j

−1

\frac}

2j−1m​

,如果按照張上下界來進行列舉那麼時間複雜度為o(n

m)

o(nm)

o(nm)

#pragma gcc optimize(2)

%:pragma gcc optimize(3

)%:pragma gcc optimize

("ofast")%

:pragma gcc optimize

("inline"

)#include

#include

#include

using

namespace std;

const

int n=

5100

,xjq=

1e9+7;

int n,m,a[n]

,p[n]

,f[2][

14][n*2

],ans,m;

intmain()

}for

(int i=

1;i<=m;i++

) ans=

(ans+f[n&1]

[i][0]

)%xjq;

printf

("%d"

,ans)

;}

nssl 1336 膜拜神牛

d es crip tion description descri ptio n 給定長度為n nn的序列a aa和b bb,若滿足ai aj a i geq a j ai aj 且bi b jb i leq b j bi bj 則i,ji,j i,j互相膜拜,求最大的互不膜拜集合 資料範圍 n 1...

nssl1476 聯 線段樹

無限長的01 0101 序列,每次進行乙個操作 區間內賦值為0 00區間內賦值為1 11區間取反 求第乙個0 00的位置 離散化 儲存每個區間的左右端點和他們加一之後的值 後可以用線段樹儲存第乙個0 00和第乙個1 11的位置。然後區間取反時就交換兩個值並且讓laz ylazy lazy 標記同樣取...

洛谷1522 牛的旅行

洛谷1522 牛的旅行 題目描述 農民 john的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區通過任何路徑都不連通。這樣,farmer john就有多個牧場了。john想在牧場裡新增一條路徑 注意,恰好一條 對這條路徑有以下限制...