شما اول تعداد تکرار مقسوم علیه های اول رو حساب میکنی میشه مثلا a,b,c,...
تعداد کل مقسوم علیه ها میشه
(a+1) (b+1) ...
اینم کد که به ثانیه هم نمیرسه :)
#include <iostream>
#include <vector>
#include <cmath>
#include <chrono>
#include <map>
using namespace std;
vector<unsigned long long>primes;
bool isPrime(unsigned long long num)
{
if (primes.size() != 0 && primes[primes.size() - 1]> num)
return false;
if (num % 3 ==0 || num%2==0)
return false;
int half = pow(num, 0.5);
for (unsigned long long i = 4; i <= half; i++)
{
if (num%i == 0)
return false;
}
return true;
}
bool checkNumber(unsigned long long number)
{
if (isPrime(number))
return true;
map<int, int>primeDevisors;
unsigned long long mmm = number;
for (int i = 0; i<primes.size(); i++)
{
while (number%primes[i] == 0 && number >1)
{
number /= primes[i];
primeDevisors[primes[i]]++;
}
}
if (isPrime(number))
{
primeDevisors[number]++;
number = 1;
}
unsigned long long n = number / primes[primes.size() - 1];
for (unsigned long long i = primes[primes.size() - 1] + 1; i <= n; i++)
{
if (isPrime(i))
{
primes.push_back(i);
while (number%i == 0 && number >1)
{
number /= i;
primeDevisors[i]++;
}
}
}
int count = 1;
for (auto i = primeDevisors.begin(); i != primeDevisors.end(); i++)
{
count *= (i->second + 1 );
}
if (count > 500)
{
cout << mmm<<"\n";
return false;
}
return true;
}
int main()
{
unsigned long long number = 1;
primes.reserve(30000);
primes.push_back(2);
primes.push_back(3);
auto start = chrono::steady_clock::now();
while (checkNumber(number))
{
number += (number+1);
}
auto end = chrono::steady_clock::now();
auto diff = end - start;
cout << chrono::duration <double, milli>(diff).count() << " ms" << endl;
cout << chrono::duration <double, nano>(diff).count() << " ns" << endl;
}