LoginSignup
0
0

More than 5 years have passed since last update.

ABC112 D問題

Posted at

多分行けそうと考察ふわふわで投げたら通ったので,反省を込めて

問題

やりたかったこと

求める$M=a_0+a_1+...+a_N$となる$a_{0toN}$の最大公約数なので,それを$b$としたとき
$$a_0\%b=0 \\
a_1\%b=0 \\
a_N\%b=0$$
なので$M$を割り切れる$b$で最大のものを求めたい的なことを考えていた.

投げたコード

template<class X> void is_prime( X n  , X m){
    if( n == 1 )
        cout << m << endl;
    else if( m % n == 0 ){
        cout << m / n << endl;
    }
    else{
        ll M = 0;
        int i = 2;  
        //ll lim = sqrt(m)+1;
        while( i * n <= m /*&& i < lim*/ ){
            if( m % i == 0){
                M = i;
            }
            i++;
        }
        if( M )
            cout << M << endl;
        else{
            if( m % 2 ){
                cout << 1 << endl;
            }
            else{
                if( m / n >= 2 ) 
                    cout << 2 << endl;
                else
                    cout << 1 << endl;
            }
        }
    }
}
int main(){
    ll n,m;
    cin >> n >> m;
    is_prime( n , m );
    ret 0;
}

素数判定のライブラリを100年ぶりに出したら無意味にtemplateとか使って笑いました
割り切れるときのペアになる数$\frac{m}{i}$を計算を代入している処理をしていないので,sqrtをちゃんと使うとWAになります.
テストケースが恐らく大きい$M$と小さい$N$の組み合わせがなかったのか,TLEすることなく通ってますがそういったのがあればTLEだと思います.ラッキー.

ゆっくり考えてわかったこと

$N=3,M=14$のとき
$$a_0+a_1+a_2=14$$
になる,$a_{0to2}$を考えるとき,$M$の約数$b$(最大とは限らない)と$c_{0to2}$を用いて,とする.
$$a_i=b・c_i$$
14の約数は1,2,7,14なので
$b=1$のとき,$a_i=1・c_i$
$b=2$のとき,$a_i=2・c_i$
$b=7$のとき,$a_i=7・c_i$
$b=14$のとき,$a_i=14・c_i$
$b$が7より大きいときは,全ての$c_i$が最小の1でも$a_0+a_1+a_2=14$を満たさなくなるのでは?🤔🤔🤔
つまり,$b・N>M$となる$b$はダメなのでは?🤔🤔🤔
ということは,$b・N<=M$の範囲で最大になる$b$を求めればいいのでは?🤔🤔🤔
$m/b$が$N$より大きいときは$c_i$に吸収させればいいのでは?🤔🤔🤔
約数は平方根まで求めて,ペアでとれば全て取れるのでは?🤔🤔🤔
という発想で書き直したのが次のコードです.

int main(){
    ll n,m;
    cin >> n >> m;
    ll lim = sqrt(m)+1;
    ll M = 0;   
    int i = 1;
    while( n * i <= m && i < lim ){
        if( !(m % i) ){
            M = max( M , ll(i));
            if( m >= n*(m/i) ){
                M = max( M , m/i );
            }
        }
        i++;
    }
    cout << M << endl;
    ret 0;
}

すごくシンプルになりましたね.
ACでした.
C問題を解けないので,そっちも明日とかにやっていきます.おやすみなさい.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0