BJTU1878 B數在心 快速冪詳解

2021-10-13 07:35:38 字數 3392 閱讀 3229

1000ms 256mb

相傳在某個遙遠的西方國度,有位強大而美麗的亞瑟王saber。

在某一天,她突發奇想,希望辦成乙個超大型的蒙面舞會。

她一口氣邀請了n位男士和m位女士,由於蒙著面,就無法自行挑選合適的舞伴了。

那麼,如何合理地分配每位女士的舞伴成為了困難的問題。

不過還好的是,亞瑟王統計了每位女士的對舞伴氣質和形象的最低要求。

並且她成功地把這個標準給數值化了,並將之稱為b數。

b數的計算非常簡單,如果第i位男士擁有ai枚聖晶石,那麼這位男士的b數就是ai的ai次方mod d。

(不一定擁有的聖晶石更多就心裡會有更多的b數)

現在,亞瑟王希望你可以幫她計算下最多究竟可以在蒙面舞會上配成多少對舞伴?

如果你可以給出正確的結果,那麼她可以答應你**參加這次的蒙面舞會!

第一行乙個正整數 ? (1≤?≤10),表示有 ? 組資料。

對於每組資料:

第一行為三個整數 ?,?,? (1≤?,?,?≤200000) ,其中 ? 和 ? 分別表示蒙面舞會一共來了多少位男士和多少位女士,? 表示計算b數過程中的模數。

接下來 ? 行每行乙個整數 ?? (1≤??≤200000),表示編號 ? 的男士擁有多少枚聖晶石。

接下來 ? 行每行乙個整數 ?? (1≤??≤200000) 為編號第i的女士對舞伴心裡的b數的最低要求。

對於每組資料,輸出一行:為乙個整數,表示蒙面舞會上最多可以配成多少對舞伴。

1

3 2712

31427

2
根據b數計算公式可以算出三位男士的b數分別為1,4,0。

其中b數為1,4的男士可以匹配女士的最低要求1,4,而最低要求27的女士無法獲得舞伴。

這道題我的思路是先對男士的b數進行計算,並從小到大進行排序,對女士的最低要求也從小到大進行排序,然後對每乙個b數進行對a的遍歷,由於排過序,因此選出的舞伴應該正好是既滿足

b [b

]⩽a[

a]

b[b] \leqslant a[a]

b[b]⩽a

[a]的情況下,也滿足

f ab

s(b[

b]−a

[a])

=min

b⩽i⩽

mfabs(b[b] - a[a]) = \underset\ %

fabs(b

[b]−

a[a]

)=b⩽

i⩽mmin

​因為是要保證舞伴最多,因此不能有浪費的b數。

這是大致的思路。

下面是複雜度的問題,1000ms的限制,首先這道題b數的計算很明顯是讓我們使用快速冪演算法,這其中應用到了二進位制:

舉個例子,例如計算:

3

133^

313而計算它我們可以將它轉化為:

3 13=

38×3

4×31

3^ = 3^\times3^\times3^

313=38

×34×

31就能大大減少迴圈計算的次數,那麼我們如何把任意乙個冪的指數寫成:

∑ 2k

\sum2^k

∑2k

的形式呢。

我們把指數13寫成二進位制:

1101

1101

1101

就比較了然了:

13 =1

×23+

1×22

+0×2

1+1×

20=8

+4+1

13 = 1\times2^3 + 1\times2^2 + 0\times2^1 + 1\times2^0 = 8 + 4 + 1

13=1×2

3+1×

22+0

×21+

1×20

=8+4

+1由此,我們得到統一的規律:

a ns

=xn=

x∑i=

0mai

×2

ians = x^n = x^^m a_i\times2^i}

ans=xn

=x∑i

=0m​

ai​×

2i而二進位制項是否為1,由》右移位運算子進行遍歷即可。

從而我們實現了這一演算法,**如下:

long

long

quick_pow

(long

long x,

long

long n,

long

long m)

x = x * x % m;

n >>=1;

}return res;

}

這已經完成了一大步,接下來要有簡化迴圈的好習慣,(別問我怎麼知道的…)比如這道題的配對環節的迴圈,我們將已經配對的b[i] = 200005,a[j] = 0,這樣就不會再被考慮,正是因為此,我們下乙個a的對b的遍歷就不需要從i = 0開始了,從上一次結束的地方開始就可以,因為我們排過序了。

這樣我們就得到了ac**:

#include

#include

#include

#include

#include

using

namespace std;

int t;

long

long n,m,d;

long

long

*a;long

long

*b;int ans =0;

int m;

long

long

quick_pow

(long

long x,

long

long n,

long

long m)

x = x * x % m;

n >>=1;

}return res;

}int

main()

sort

(a,a+n)

;for

(long

long i =

0;i < m;i++

)sort

(b,b+m)

;for

(long

long i =

0;i < m;i++)}

} cout

delete b;

}return0;

}

這裡相當於本小白複習快速冪了?,所以寫得多了些。

多路查詢樹 B數 B 樹 B 樹 原理

1 二叉樹需要載入到記憶體的,如果二叉樹的節點少,沒有什麼問題,但是如果二叉樹的節點很多 此如1億 就存在如下問題 2 問題1 在構建二叉樹時,需要多次進行 o操作海量資料存在資料庫或檔案中 節點海量,構建二叉樹時,速度有影響 3 問題2 節點海量,也會造成二叉樹的高度很大,會降低操作速度 1 在二...

高數 高數B模擬試卷

高數b 模擬試卷 一 選擇題 滿分20分 本大題共有5個小題,每小題4分,在每小題給出的四個選型中,只有一項符合題目要求,把所選項前的字母填在題目後的括號內.1.設 f x x0 sintdt 則f f 2 a.1b.1c.cos1d.1 cos1.2.limx 0x2sin1x sinx a.1b...

B 數的插入實現

include include include include include include include include using namespace std 徐struct treenode void printdata return result bool findvalue int v...