大數乘除 HDU 1261 字串數

2021-09-25 20:19:09 字數 1220 閱讀 3508

題目解析:

有n個不同字元,每個字元次數為 a1, a2, … an;

如果不考慮重複字元數,那不同的字串個數就是∑(an)個字元的全排列

再除以重複的 a1到an各自全排列之和。

本題關鍵是全排列過程中整數範圍會超過int或者long long的範圍,需要用陣列儲存大整數自行實現大整數的乘除

#include

using namespace std;

/* an / sigma ai */

int num[26]

, res[

1000

], len =0;

// res陣列存的是大整數各位的數字,高位在前,方便擴充套件位和縮位

// sortres函式是將陣列res裡存的大整數轉成十進位制,把每一位大於9的進製

void

sortres()

res[i +1]

+= res[i]/10

; res[i]

= res[i]%10

;}}}

//函式a是計算全排列

voida(

int n)

sortres()

;}}//大整數除法

void

divideres

(int n)

res[i -1]

+= res[i]*10

; res[i]=0

;}else

res[i]

= res[i]

/ n;}}

}int

main()

memset

(num,0,

sizeof

(num));

memset

(res,0,

sizeof

(res));

long

long total =0;

//total是字元個數總數

for(

int i =

0; i < n; i++)a

(total)

;for

(int i =

0; i < n; i++)}

for(

int i = len -

1; i >=

0; i--

) cout << endl;

}}

43 字串相乘 大數相乘(字串相乘)

給定兩個以字串形式表示的非負整數num1和num2,返回num1和num2的乘積,它們的乘積也表示為字串形式。示例 1 輸入 num1 2 num2 3 輸出 6 示例 2 輸入 num1 123 num2 456 輸出 56088 說明 num1和num2的長度小於110。num1和num2只包含...

大數相乘 43 字串相乘

給定兩個以字串形式表示的非負整數 num1 和 num2,返回 num1 和 num2 的乘積,它們的乘積也表示為字串形式。示例 1 輸入 num1 2 num2 3 輸出 6 示例 2 輸入 num1 123 num2 456 輸出 56088 說明 num1 和 num2 的長度小於110。nu...

hdu2920 字串雜湊

模式串中 把它分成一截截,當某一截在s串中多個位置能找到匹配,找第乙個匹配點,貪心 因為當中間有 可以利用它跳過一些字元,當遇到 先跳過乙個字元,其他的一截截貪心去找到匹配位置,若最後剩餘偶數個字元,則match 第一截和最後一截如果是非 和 必須嚴格匹配 找來的雜湊寫法 include inclu...