//no even number in the table void factor_using_table_odd(i64 n, IntPairVec& vpairs, const vector<int>& ftable) { vpairs.clear(); i64 n2 = 0; while( (n & 1) == 0){ n >>= 1; ++n2; } if(n2) vpairs.push_back(IntPair(2, n2)); assert( (n & 1) > 0); int np = (n-1) >> 1; int pwr = 0; int curr_fac = ftable[np]; while(curr_fac>1){ ++pwr; n /= curr_fac; np = (n-1) >> 1; while(curr_fac == ftable[np]){ ++pwr; n /= ftable[np]; np = (n-1) >> 1; } vpairs.push_back(IntPair(curr_fac, pwr)); curr_fac = ftable[np]; pwr = 0; } }
//the factors are from small to large //first is prime number, second is power void factor_using_table(i64 n, IntPairVec& vpairs, const vector<int>& ftable) { vpairs.clear(); int pwr = 0; int curr_fac = ftable[n]; while(curr_fac>1){ ++pwr; n /= ftable[n]; while(curr_fac == ftable[n]){ ++pwr; n /= ftable[n]; } vpairs.push_back(IntPair(curr_fac, pwr)); curr_fac = ftable[n]; pwr = 0; } }