ホームに戻る
素因数分解

素因数分解はO(N^(1/2))を要する。
O(NloglogN)の前準備さえあれば、
それ以降は1からNまでの素因数分解をO(logN)で行う方法もある。

//重複を許す場合 vector 版、許さない場合 set 版を使う

// vector 版
vector<long long> p_decom(long long m){
  vector<long long> v;

  while(m % 2 == 0){
    v.push_back(2LL);
    m /= 2LL;
  }

  for(long long i = 3LL; i * i <= m; i += 2LL){
    while(m % i == 0){
      v.push_back(i);
      m /= i;
    }
  }

  if(m > 1LL){
    v.push_back(m);
  }

  sort(all(v));

  return v;
}

// set 版
vector<long long> p_decom(long long m){
  vector<long long> v;
  set<long long> se;

  while(m % 2LL == 0){
    se.insert(2LL);
    m /= 2LL;
  }

  for(long long i = 3LL; i * i <= m; i += 2LL){
    while(m % i == 0LL){
      se.insert(i);
      m /= i;
    }
  }

  if(m > 1LL){
    se.insert(m);
  }

  set<long long>::iterator itr = se.begin();

  while(itr != se.end()){
    v.pb(*itr);
    itr++;
  }

  sort(all(v));

  return v;
}

// O(logN)版

#define N 100000

long long prime[N+1];

// 下準備
void init_prime(long long n){
  memset(prime,0,sizeof(prime));
  for(long long i = 2; i < n+1; i++){
    if(prime[i] == 0){
      for(long long j = i*2; j < n+1; j += i){
        prime[j] = i;
      }
    }
  }
}

// 先にinit_primeしておくこと
vector<long long> p_decom(long long a){
  vector<long long> ret;
  while(prime[a]!=0){
    ret.pb(prime[a]);
    a /= prime[a];
  }
  ret.pb(a);
  sort(ret.begin(),ret.end());
  return ret;
}

inserted by FC2 system