この問題は、実際に(X)= B / \ [cは、x]はx = Dの数で満足する必要があります。
[C、X] = D => X | D
したがって、xは約Dからの数であります
だから、この質問のアイデアは非常に明確である:各約列挙dの数は、条件を満たすために番号の数を見つけます。時間が複雑:SQRT(唯一の1からSQRTに列挙(d)ができます)ログを掛け、確かに破裂しません。
開くことを忘れないでください長い長いです
コード
書式#include <iostreamの> 使用して 名前空間はstdを、 // 快读 長い 長い(){読み取り 長い 長い RET = 0、F = 1 。 チャー CH = GETCHAR()。 一方、(!isdigit(CH)){ 場合(CH == ' - ')、F = - 1 。 CH = GETCHAR()。 } 一方(isdigit(CH)){ RET = RET * 10 + CH - ' 0 ' 。 CH= GETCHAR(); } 戻り RET * F; } // 高速書き込み ボイドライト(ロング ロングX){ IF(X> = 10)(X /ライト10 ) のputchar(Xの%10 + ' 0 ' ); } 長い 長いT、A、B、C、D、ANS; // 最大公約数(ユークリッドアルゴリズム) 長い 長い GCD(長い 長い X、長い 長いYは){ 戻り Yの== 0を X:GCD(? Y、X%Y); } // 求最小公倍数 長い 長い LCM(長い 長い X、長い 長いY){ リターン・ X *のY / GCD(X、Y) } int型のmain(){ T = 読み取ります()。 一方、(t-- ){ ANS = 0 。= read()は、B =読み取る()、C =読み取る()、D = 読み取ります(); 以下のための(長い 長 i = 1 ; iは= D <*; iが++){ // 从1到SQRT(D) もし iが==(Dの%0){ 場合(GCD(I)== B && LCM(C、I)== D)ANS ++ 。 もし(D / I =!I){ 場合(GCD(D / I)==(B && LCM C、D / I)== D)ANS ++ 。 } } } 書き込み(ANS)。 putchar(' \ nを' ); } 戻り 0 。 }