記念すべき500回目ということで賞金付き。
しかし、div 2はいまいち納得できない結果となった。Hardの問題を解いてsystem testをpassしている人たちの回答が、なんか微妙。。。
ハッシュを使ってるんですけど、たまたまsystem test通っただけで、正規の解答とは異なるのでは??という疑問がちらほら。。
私も、そう思います。確かに、実入力10^5程度に対して、{10^9}^2のサイズのhashを使えば衝突が起こることは非常にまれと言えますが。。。
納得いかん。。。
てことで、がんばって解いてみました。
私の解法は、素因数分解を使用しています。一応system testは通ったけど、あっているかは不明。。。
こんな感じっす。。
- #define FOR(i, s, e) for (int i = (int)(s); i < (int)(e); i++)
- #define EACH(itr,c) for(__typeof((c).begin()) itr=(c).begin();itr!=(c).end();itr++)
- typedef map<int, int> MII;
- set<MII>seq;
- class GeometricProgressions {
- public:
- int count(int b1, int q1, int n1, int b2, int q2, int n2) {
- if (!seq.empty())
- seq.clear();
- setFactorizedSeq(b1, q1, n1);
- return checkFactorizedSeq(b2, q2, n2) + seq.size();
- }
- private:
- MII nextElemFactors(MII curr, MII mul) {
- EACH(itr, mul) {
- if (curr.count(itr->first)) {
- if (itr->first != 0 && itr->first != 1)
- curr[itr->first] += itr->second;
- }
- else {
- if (itr->first == 0) {
- curr.clear();
- curr[0] = 1;
- }
- else if (itr->first != 1)
- curr[itr->first] = itr->second;
- }
- }
- return curr;
- }
- int checkFactorizedSeq(int b, int q, int n) {
- int ret = 0;
- MII facb = factorize(b);
- MII facq = factorize(q);
- FOR (i, 0, n) {
- if (!seq.count(facb)) ++ret;
- if (!b) break;
- MII fact = nextElemFactors(facb, facq);
- if (fact == facb) break;
- facb = fact;
- }
- return ret;
- }
- void setFactorizedSeq(int b, int q, int n) {
- MII facb = factorize(b);
- MII facq = factorize(q);
- FOR (i, 0, n) {
- seq.insert(facb);
- if (!b) break;
- facb = nextElemFactors(facb, facq);
- }
- }
- MII factorize(int n) {
- MII factors;
- if (n == 0 || n == 1) {
- factors[n] = 1;
- return factors;
- }
- FOR (i, 2, sqrt(n)+1)
- while (n % i == 0) {
- if (factors.count(i)) factors[i]++;
- else factors[i] = 1;
- n /= i;
- }
- if (n != 1)
- factors[n] = 1;
- return factors;
- }
- };
0 件のコメント:
コメントを投稿