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想在牧場裡新增一條路徑 注意,恰好一條 對這條路徑有以下限制...