We use cookies to ensure you have the best browsing experience on our website. Please read our cookie policy for more information about how we use cookies.
// array to store prime factors
int factor[MAX] = { 0 };
// function to generate all prime factors
// of numbers from 1 to 10^7
void generatePrimeFactors()
{
factor[1] = 1;
// Initializes all the positions with their value.
for (int i = 2; i < MAX; i++)
factor[i] = i;
// Initializes all multiples of 2 with 2
for (int i = 4; i < MAX; i += 2)
factor[i] = 2;
// A modified version of Sieve of Eratosthenes to
// store the smallest prime factor that divides
// every number.
for (int i = 3; i * i < MAX; i++) {
// check if it has no prime factor.
if (factor[i] == i) {
// Initializes of j starting from i*i
for (int j = i * i; j < MAX; j += i) {
// if it has no prime factor before, then
// stores the smallest prime divisor
if (factor[j] == j)
factor[j] = i;
}
}
}
}
// function to calculate number of factors
int calculateNoOFactors(int n)
{
if (n == 1)
return 1;
int ans = 1;
// stores the smallest prime number
// that divides n
int dup = factor[n];
// stores the count of number of times
// a prime number divides n.
int c = 1;
// reduces to the next number after prime
// factorization of n
int j = n / factor[n];
// false when prime factorization is done
while (j != 1) {
// if the same prime number is dividing n,
// then we increase the count
if (factor[j] == dup)
c += 1;
/* if its a new prime factor that is factorizing n,
then we again set c=1 and change dup to the new
prime factor, and apply the formula explained
above. */
else {
dup = factor[j];
ans = ans * (c + 1);
c = 1;
}
// prime factorizes a number
j = j / factor[j];
}
// for the last prime factor
ans = ans * (c + 1);
return ans;
}
// Driver program to test above function
int main()
{
// generate prime factors of number
// upto 10^7
generatePrimeFactors();
vectora(10000002);
for (int i = 1; i < 10000002; i++)
a[i]= calculateNoOFactors(i);
vectorcount(10000001);
for(int i=1;i<=10000000;i++)
{
if(a[i]==a[i+1])
{
count[i]=count[i-1]+1;
}
else
{
count[i]=count[i-1];
}
}
int t;
scanf("%d",&t);
while(t--)
{
int k;
cin>>k;
printf("%d\n",count[k-1]);
}
return 0;
Project Euler #179: Consecutive positive divisors
You are viewing a single comment's thread. Return to all comments →
why my code is giving timeout canbody give a hint
include
using namespace std;
const int MAX = 10000002;
// array to store prime factors int factor[MAX] = { 0 };
// function to generate all prime factors // of numbers from 1 to 10^7 void generatePrimeFactors() { factor[1] = 1;
}
// function to calculate number of factors int calculateNoOFactors(int n) { if (n == 1) return 1;
}
// Driver program to test above function int main() { // generate prime factors of number // upto 10^7 generatePrimeFactors(); vectora(10000002); for (int i = 1; i < 10000002; i++) a[i]= calculateNoOFactors(i); vectorcount(10000001); for(int i=1;i<=10000000;i++) { if(a[i]==a[i+1]) { count[i]=count[i-1]+1; } else { count[i]=count[i-1]; }
}