#include <stdio.h>
#include <vector>
#include <utility>
using namespace std;
// Gets the prime factors of a number with the exponents. No need to have the sieve beforehand because it loops odd numbers (not primes).
// e.g. getPrimeFactorizationOf(2) = {(2,2)(3,1)}
vector<pair<int, int> > getPrimeFactorizationOf(int n) {
vector<pair<int, int> > factors;
pair<int, int> current_factor = pair<int, int>(2, 0);
while (n % 2 == 0) {
current_factor.second++;
n /= 2;
}
if (current_factor.second > 0)
factors.push_back(current_factor);
for (int candidate = 3; candidate * candidate <= n && n > 1; candidate += 2) {
int exponent = 0;
while (n % candidate == 0) {
exponent++;
n /= candidate;
}
if (exponent > 0)
factors.push_back(pair<int, int>(candidate, exponent));
}
if (n > 1)
factors.push_back(pair<int, int>(n, 1));
return factors;
}
int numberOfDivisorsOf(int n) {
vector<pair<int, int> > factors = getPrimeFactorizationOf(n);
int numberOfDivisors = 1;
for (int i = 0; i < factors.size(); i++)
numberOfDivisors *= (factors[i].second + 1);
return numberOfDivisors;
}
vector<int> seq;
void generateSequence() {
int last_element = 1;
while (last_element <= 1000000) {
seq.push_back(last_element);
last_element = last_element + numberOfDivisorsOf(last_element);
};
seq.push_back(last_element);
}
/**
* Returns the index of value or the index of the successor
* e.g. bin_search( {10,11,12,14,15}, 11) = 1
* e.g. bin_search( {10,11,12,14,15}, 13) = 3
*/
int bin_search(int value, const vector<int> & sorted_vector) {
int left = 0;
int right = sorted_vector.size() - 1;
while (left < right) {
int mid = (left + right) >> 1;
if (sorted_vector[mid] == value)
return mid;
if (sorted_vector[mid] > value)
right = mid - 1;
else
left = mid + 1;
}
while (right < sorted_vector.size() && sorted_vector[right] < value)
right++;
return right;
}
int main() {
generateSequence();
int cases;
scanf("%d", &cases);
for (int cas = 1; cas <= cases; cas++) {
int a, b;
scanf("%d%d", &a, &b);
int a_pos = bin_search(a, seq);
int b_pos = bin_search(b, seq);
if (b_pos < seq.size() && seq[b_pos] == b)
b_pos++;
printf("Case %d: %d\n", cas, b_pos - a_pos);
}
}
Friday, April 24, 2015
UVa 11876 - N + NOD (N)
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment