傳送門
給定乙個包含 n
nn 個元素的集合 p
=p=\
p=,求有多少個集合 a⊆p
a⊆pa⊆
p,滿足任意 x∈a
x∈ax∈
a 有 2x∉
a2x∉a
2x∈/a
,且對於 a
aa 在 p
pp 中的補集 b
bb,也滿足任意 x∈b
x∈bx∈
b 有 2x∉
b2x∉b
2x∈/b
。有 q
qq 個詢問,每次給出乙個整數 m
mm,詢問大小為 m
mm 的集合有多少個。
答案對 10000019
10000019
100000
19取模。
資料範圍:n,m
≤1018
n,m≤10^
n,m≤10
18,q
≤100000
q≤100000
q≤1000
00。這道題在考場上只想到了 o(n
)o(n)
o(n)
的做法,拿了 80
8080
分。我們以 n=10
n=10
n=10
為例來講一下這道題吧。
我們把這十個數分成若干條鏈,每個數都與它的兩倍相連,得到下圖。
那麼根據題意,相鄰的兩個點中必須選乙個。
我們設鏈長為 l
ll。對於一條長度為偶數的鏈,它對 a
aa 集合有 l
2\frac l 2
2l 的貢獻,有兩種選擇情況。對於一條長度為奇數的鏈,可以把鏈頭取出來,剩下的就是偶鏈的情況了,而且鏈頭可以隨意選 a
aa 或者 bbb。
假設我們有 c
1c_1
c1 條偶鏈,c
2c_2
c2 條奇鏈,且當前詢問的是 m
mm,那麼答案就是:
a ns
=2c1
(c2m
−c12
)ans=2^\binom2}
ans=2c
1(m
−2c1
c2
)由於模數 p
pp 比較小,可以用 lucas 定理來解決上式的組合數。
現在的問題就是怎麼統計奇鏈和偶鏈的數量。
我們不妨列舉鏈長,那麼對於乙個長度為 l
ll 的鏈,如果鏈頭是 x
xx,那麼有:
x\cdot 2^\le n\\ x\cdot 2^l>n \end
2ln
2l−1
n,我們只需要這個範圍內的奇數,分類討論以下即可。
ps:這道題不好講清楚,可以自己想一想,捋捋思路。
#include
#include
#include
#define p 10000019
#define ll long long
using
namespace std;
ll n,sum=
0,a=0;
int q,temp=
1,fac[p]
,ifac[p]
;int
add(
int x,
int y)
intdec
(int x,
int y)
intmul
(int x,
int y)
intpower
(int a,
int b,
int ans=1)
intprework()
intc
(int n,
int m)
intlucas
(ll n,ll m)
ll calc
(ll l,ll r)
intquery
(ll x)
intmain()
ll x;
while
(q--
)return0;
}
5 11返校測試T2
有k k第一行乙個整數n。第二行有n個正整數,每個數字代表一張選票所選的人的編號。每行乙個正整數,為優勝者的編號,由小到大。如果沒人獲勝,則輸出 no such person.8 5 2 3 6 2 5 2 72優勝者為2號。下面是這個題的思路qwq 將所有的選票進行從小到大排序 快排解決 然後將陣...
2018 10 27測試T2 洗衣服
傳送門 一道貪心題,但考場上沒貪出來 維護兩個堆,分別存洗衣服和烘乾衣服的時間 每次加進來一件衣服,就在之前最早結束的那一台機器裡操作,這樣會是最優的 洗衣服和烘乾衣服都這樣搞,最後再用最大配最小的原則求最大值就行了 include include include include define n ...
2018 11 02測試T2 飛越行星帶
傳送門 這道題比較妙啊 把每個行星看成乙個點 把 x xx 軸和 y l y ly l 看成兩個特殊的點 把行星之間的距離看做邊 每個點與 x xx 軸的邊為 y iy i yi 與 y l y ly l 的邊為 l y il y i l yi 從小到達加邊,如果發現 x xx 軸和 y l y l...