Problem 1060 : No Story

Problem J: No Story
http://rose.u-aizu.ac.jp/onlinejudge/ProblemSet/description.jsp?id=1060&lang=jp

  • 問題概要

LCM(a, b) = L となるような正の整数 a, b (a ≤ b) の組み合わせはいくつか。

  • 解法

Lを素因数分解する。
約数を全列挙する。
LCMとは何かということを考えながら、その約数とセットになるとLCMがLになるようなbの数の合計を数える。

a < b , b> aのとき両方のときを数えてるので2で割る、ただし、a==b(つまり=L)のときは一回しか足されてないので、1を足して2で割る。

  • ソース
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<sstream>
#include<cassert>
#include<queue>
#include<stack>

#define REP(i,b,n) for(long long int  i=b;i<n;i++)
#define rep(i,n)   REP(i,0,n)
#define ALL(C)     (C).begin(),(C).end()
#define FOR(it,o)  for(__typeof((o).begin()) it=(o).begin(); it!=(o).end(); ++it)


const long long int  MAX  = 1000001;
bool p[MAX];
using namespace std;

vector<long long int > primeFactor( long long int  n ){
  vector<long long int > v;
  rep(i, sqrt(n)+1){
    if(!p[i])continue; 
    if( n % i != 0 )continue;
    long long int  cnt = 1;
    n /= i;
    while( n % i == 0){
      n /= i;
      cnt++;
    }
    v.push_back(cnt);
  }  
  if( n != 1 ) v.push_back(1);
  return v;
}

long long int  solve(vector<long long int > &pf, long long int  now, vector<long long int > &comb){
  if(now == pf.size()){
    long long int  tmp = 1;
    rep(i, pf.size()){
      if(pf[i] == comb[i]){
	tmp *= pf[i] + 1;
      }
    }
    return tmp;
  }
  long long int  sum = 0;
  rep(i, pf[now] + 1){
    comb.push_back(i);
    sum += solve(pf, now+1, comb);
    comb.pop_back();
  }
  return sum;
}

main(){
  rep(i, MAX)p[i] = true;
  p[0] = p[1] = false;
  rep(i, sqrt(MAX)){
    if(!p[i])continue;
    for(long long int  j = 2; j * i < MAX; j++){
      p[i*j] = false;
    }
  }
 
  long long int  l;
  while( cin >> l ){
    if( l == 0)break;
    vector<long long int > pf = primeFactor(l), comb;
    cout << ( solve(pf, 0, comb) + 1) / 2 << endl;
  }
}