2019 08 24測試 T2 數學課

2021-09-26 11:17:28 字數 2178 閱讀 2192

傳送門

給定乙個包含 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...