給出乙個二元組(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
複製
14 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 ...