小hi最近在追求一名學數學的女生小z。小z其實是想拒絕他的,但是找不到好的說辭,於是提出了這樣的要求:對於給定的兩個正整數n和m,小hi隨機選取乙個n的約數n',小z隨機選取乙個m的約數m',如果n'和m'相等,她就答應小hi。
小z讓小hi去編寫這個隨機程式,到時候她review過沒有問題了就可以抽籤了。但是小hi寫著寫著,卻越來越覺得機會渺茫。那麼問題來了,小hi能夠追到小z的機率是多少呢?
輸入
每個輸入檔案僅包含單組測試資料。
每組測試資料的第一行為兩個正整數n和m,意義如前文所述。
對於40%的資料,滿足1<=n,m<=106
對於100%的資料,滿足1<=n,m<=1012
輸出
對於每組測試資料,輸出兩個互質的正整數a和b(以a分之b表示小hi能夠追到小z的機率)。
樣例輸入
3 2
樣例輸出
4 11)分別求出a,b的所有約數,然後求出公共的,再進行計算(看資料範圍就知道這個會超時)
2)只求個數:分別求出a,b和他倆的最大公約數(輾轉相除法,這個就不用說了)的約數個數,a1,a2,a3,然後計算a3/(a1*a2)就行了
這裡就用到了約數個數定理:
設n=p1^k1*p2^k2*……*pn^kn,其中p1,p2,……,pn為互不相同的質數,k1,k2,……,kn為正整數(這叫n的標準分解)
則n所有正約數個數為(k1+1)(k2+2)*……*(kn+1)個
例如:將378000分解質因數378000=2^4×3^3×5^3×7^1
由約數個數定理可知378000共有正約數(4+1)×(3+1)×(3+1)×(1+1)=160個。
#include#includeusing namespace std;
typedef long long doublelong;
doublelong yueshu(doublelong a,doublelong b)
return b;
}int geshu(doublelong a)
if(n!=0)
}if(a!=1)
if(sum==1)
return sum;
}int main()
約數個數定理
編輯 對於乙個大於1正整數n可以 分解質因數 則n的 正約數的個數就是 其中a 1 a2 a 3 ak是p 1 p2 p 3,p k的指數。編輯首先同上,n可以 分解質因數 n p1 a1 p2 a2 p3 a3 pk ak,由約數定義可知p1 a1的約數有 p1 0,p1 1,p1 2.p1 a1...
約數個數定理and約數和定理
定理 對於乙個大於1正整數n可以 分解質因數 則n的正約數 的個數就是 證明 省略 舉個栗子 例題 正整數378000共有多少個 正約數?解 將378000 分解質因數378000 2 4 3 3 5 3 7 1 由約數個數定理可知378000共有正約數 4 1 3 1 3 1 1 1 160個。c...
約數個數定理 約數和定理
1 如果我們要求乙個數的所有因數的個數會怎麼去求呢?首先想到最簡單的方法就是暴力求解就可以。當然資料小 或者測試資料少就很簡單就可以過了。2 如果求乙個區間內的數的所有因數的個數呢?或者求乙個區間內的數的因數最大的數以及最大的因數 正因數 的個數?這樣的話,資料大一些,組數多一些,可能就要tle,所...