牛客OI賽制測試賽2 A 無序組數

2022-04-28 18:12:13 字數 1814 閱讀 1247

給出乙個二元組(a,b)

求出無序二元組(a,b) 使得(a|a,b|b)的組數

無序意思就是(a,b)和(b,a) 算一組.

第一行資料組數 t(1≤t≤10000)

接下來t行,每行兩個正整數 a,b(1≤a,b≤10000)

共t行,每行乙個結果
示例1

複製

1

4 6

複製

11

樣例解釋:

二元組如下:

(1,1)(1,2)(1,3)(1,6)

(2,1)(2,2)(2,3)(2,6)

(4,1)(4,2)(4,3)(4,6)

共12組.

無序二元組如下:

(1,1)(1,2)(1,3)(1,6)

(2,2)(2,3)(2,6)

(4,1)(4,2)(4,3)(4,6)

共11組

$n^2$的暴力應該無腦寫吧,就不在此多說了,直接講正解。

a和b$\le$10000,我不知道在乙個迴圈裡,for(i=1 ->max(a,b)),然後判斷i與a,b的大小這樣來列舉a,b的因數可不可以過,$1000 \times 10000$說不定可以試試。

我們來說我比較安全的解法。

我們需要先找出a,b每個數的因子個數,當然我們需要列舉,假設我們在列舉找出a的乙個a,那麼a/a又何嘗不是另乙個因子,這樣的話我們找到乙個因子,因子數加2,當然這個數最大為

為$\sqrt a \times \sqrt a$,所以我們對於每個t最多列舉$ \sqrt a + \sqrt b$次,當然對於$\sqrt a$是a 的因子這種$i = a/ i $的情況需要特殊判斷一下,只能因字數加1.

對於a的每個因子,用乙個陣列標記一下,為了方便判斷b的因子中有多少個與之相同的數的個數。

同樣的方法,我們求出b的同時記錄有多少個相同的因子。

下面來說找出相同的因子數的個數怎麼用。

設a的因字數為:1 3 4 5

設b的因子數為:1 4 5 7

我們用a的因子來配b的因子:1(4種),3(4種),4(3種),5(2種)

我們發現若這個數不是公共因子,那麼對於每個數情況個數都為b的因子數量,若為公共因子,第一次出現情況數為b的因字數,第二次出現為b的因字數-1,第三次-2...。

那麼答案就可以計算為:a的因子的個數$\times$b的因子的個數-1-2-...-(公共因子數-1)。

對於-1-2..這部分可以稍微優化一下,作用不是很大啦。

if(sumv%2==0)sumv=(sumv+1)*(sumv/2

);else sumv=(sumv+2)*(sumv/2)+1; //

sumv表示公共因子個數。

**:

#include #include 

#include

#include

#include

using

namespace

std;

intt,a,b,suma,sumb,sumv;

bool vis[100006

];int

main()

}for(int i=1; i<=q; i++)

}sumv--;

if(sumv%2==0)sumv=(sumv+1)*(sumv/2

);

else sumv=(sumv+2)*(sumv/2)+1

; printf(

"%d\n

",suma*sumb-sumv);

}}

牛客OI賽制測試賽2

題目描述 給出乙個二元組 a,b 求出無序二元組 a,b 使得 a a,b b 的組數 無序意思就是 a,b 和 b,a 算一組.輸入描述 第一行資料組數 t 1 t 10000 接下來t行,每行兩個正整數 a,b 1 a,b 10000 輸出描述 共t行,每行乙個結果 組合,求a和b的因子個數,乘...

牛客OI賽制測試賽1

a 斐波那契 設f i 表示斐波那契數論的第i項 f 1 1,f 2 1,f i f i 1 f i 2 給定乙個n 求乙個整數n乙個整數,表示答案示例1 複製4複製 1對於的資料,對於的資料,對於的資料,對於的資料,思路 輸出一下找下規律 如下 include include include in...

2018 09 18 牛客OI賽制測試賽3

小a有乙個n位的數字,但是它忘了各個位上的數是什麼,現在請你來確定各個位上的數字,滿足以下條件 設第i位的數為ai,其中a1為最高位,an為最低位,k為給定的數字 1.不含前導0 2.請你求出滿足條件的方案數 發現答案只和k有關,正數是9 k,負數是10 k,然後快速冪pow 10,n 2,mod ...