No.97 最大の値を求めるくえり

No.97 最大の値を求めるくえり - yukicoder

  • N の大小でアルゴリズムを切り替える。って発想がなかなかできない。
class MaxmumValueQuery {
public:
    void solve(void) {
            int N,Q;
            cin>>N>>Q;
            vector<int> A(N);
            generateA(N,A);
            sort(RANGE(A));

            vector<bool> exist(Mod, false);
            REP(i,N)
                exist[A[i]] = true;

            //
            // 愚直な実装なら O(N*Q) なんで TLE
            //
            // m が q*A に含まれる <=> m/q in A
            // なので m=Mod-1,Mod-2,... の順で調べていくことを考えると
            // O(Q*(log(Mod)+Mod-r))) (r は条件を満たす最大値)
            //
            // N が大きい時はこのアルゴリズムは早くとまる
            // 小さいときは愚直にやればよい。
            //
            REP(_,Q)
            {
                int q;
                cin>>q;

                if (N <= 500)
                {
                    ll ans = 0;
                    REP(i,N)
                        ans = max(ans, (ll)A[i]*q%Mod);
                    cout<<ans<<endl;
                }
                else
                {
                    if (q==0)
                    {
                        cout<<0<<endl;
                        continue;
                    }
                    // O(log(Mod))
                    ll inv_q = mod_pow(q, Mod-2); // 1/q
                    // O(M-r)
                    for (int m = Mod-1; m >= 0; --m)
                    {
                        int l = inv_q*m%Mod;
                        if ( exist[l] )
                        {
                            cout<<m<<endl;
                            break;
                        }
                    }
                }
            }

    }
};