NOIP2009 Hankson興味深い質問

トピックリンク

この問題は、実際に(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 
}

 

おすすめ

転載: www.cnblogs.com/zcr-blog/p/11618531.html