快速冪演算法 牛客小白月賽1 C 分元宵

2021-10-06 20:01:29 字數 2056 閱讀 4441

牛客小白月賽1的c題

畢竟是元宵節,晚上還是要吃幾個元宵。 etéreo 家可是個大家庭,元宵的數量,甚至是餐具的數量,都多的驚人。現在,愛數學的 etéreo 又來問你有趣的數學題了,快來秒掉它! etéreo 家裡有 ς 種元宵餡, ϑ 種元宵皮,每個元宵可以選擇任意一種元宵餡和任意一種元宵皮。同時有ϖ 張桌子,每張桌子上放了 ϱ 只碗,每只碗能放乙隻元宵。每只碗都要裝乙隻元宵。etéreo 會告訴你 ς,ϑ,ϖ,ϱ 的值,想請問你有多少種裝元宵的方式。答案對λ 取模。

兩種方式被認為是不同的當且僅當至少有乙隻碗存在於兩種方式的同乙個位置但是裡面有至少乙個元宵不同。

兩個元宵被認為是不同的當且僅當元宵餡不同或者元宵皮不同。

碗和桌子都是有編號的,但是你不能改變碗或桌子的編號。

你可以認為碗和桌子都是固定的,你只能改變元宵的種類和位置。

0≤ς,ϑ≤1018

0≤ϖ,ϱ≤106

1≤λ≤1,000,000,007

這道題看起來不太難,首先有ϖ*ϱ只碗,元宵一共有ς*ϑ種,所以最後的答案為(ϖ*ϱ)ς*ϑ種,再對λ取模即可

但是指數的結果是非常大的,沒有資料結構能存下,而且指數過大,很有可能會超時,那麼如何解決這一問題?

快速冪字面意思,就是快速求冪

先寫一下最簡單的求法吧。

在最開始學習c++時,我們首先接觸到的方法是cmath中的pow函式或者迴圈計算

例如求2^10

#include#includeusing namespace std;

int main()

else

}return result;

}

可以看到,有相同的**語句,所以進行如下縮減

long long fastpow2(long long base,long long power)

power/=2;

base=base*base;}}

return result;

}

因為power為整數型別,如果為奇數可以自動捨去0.5

例如power=3,power/2結果為1,與power–;power/=2;結果相同

所以繼續優化

long long fastpow3(long long base,long long power)

return result;

}

前面說到,指數的結果非常大,所以常用到取模運算

這裡用到性質

(a*b)%c=(a%c*b%c)%c

所以**如下:

long long fastpow4(long long base,long long power,int mod)

return result;

}

這大概就是最終的寫法了,但是其中的一些地方我們可以改為位運算,速度更快

long long  fastpower5(long long  base, long long  power, long long  mod)

return result;

}

總結一下

pow效率較低,但是適用於指數為小數的情況

否則不建議使用

迴圈複雜度為o(n),快速冪演算法複雜度為o(logn)

指數越大,效果越明顯

回到分元宵的問題

最大的坑是輸入的四個資料可能有0,需要單獨判斷,否則通過率為98%。

最後,題目的答案

#includeusing namespace std;

typedef long long ll;

ll a;

ll fastpower(ll base, ll power);

int main()

cout << fastpower(fastpower(((c % a) * (o % a)) % a, w), e);

}ll fastpower(ll base, ll power)

return result;

}

牛客小白月賽1 C 分元宵 快速冪

題目鏈結 思路 有 a 種 元宵餡,b 種元宵皮 所以 我們可以認為 有q a b 種 元宵 有 c 張桌子 每張桌子上有 d 個碗 所以 我們可以認為 一共有w c d 種位置 兩種不同方式的鑑定 是 至少存在乙個相同的位置 上面的 元宵 是不同的 我們可以認為每個位置 都有q種選擇 所以最後的答...

牛客小白月賽1

well knowed數學結論場 a是兩個重要極限啊,我忘了。bexp函式,exp x e x 輸出固定位數cout fixed setprecision c c.d.e.f 水題?gdpi 題意1 n按順序入棧,1不是第乙個出棧,可能的出棧順序有多少種 分析卡特蘭數 h n c 2n,n n 1 ...

牛客小白月賽3 C 博弈

傳送門 題目描述 xhrlyb在和cwbc玩遊戲。在乙個多重集合中有在 l,r 中的全部整數各乙個,即l,l 1,l 2,r。每次xhrlyb和cwbc可以選擇乙個大於0的數字p,把p從多重集合中刪去,然後向集合中加入k個 輸入描述 輸入資料有多行,每行有三個正整數,l,r,k。輸出描述 輸出資料應...