给定任务:
为了检查她的学生如何数数,Maria Ivanovna 每年都会在家里给他们布置相同的任务 - 对于给定的自然 A,找到最小自然 N 使得 N 的 N 次方(N 乘以自身 N 次)是能被 A 整除。有必要写一个程序来解决这个问题
1 ≤ A ≤ 10^9
我写了这段代码:
#include <iostream>
#include <vector>
#include <cmath>
#include <unordered_set>
using namespace std;
vector<int> decomp (int n)
{
vector<int> ans (0);
int d = 2;
while (d * d <= n)
{
if (n % d == 0)
{
ans.push_back(d);
n /= d;
}
else
d += 1;
}
if (n > 1)
ans.push_back(n);
return ans;
}
int main()
{
int x; cin >> x;
if (x == 1)
cout << 1;
else
{
vector<int> tmp = decomp(x);
unordered_set<int> s;
for (int el: tmp)
s.insert(el);
vector<int> a (0);
for (int el: s)
a.push_back(el);
int y = 1;
for (int i = 0; i < a.size(); i++)
y *= a[i];
if (y >= 29)
cout << y;
else
{
int k = 1; int n = k * y;
while ((int)pow(n, n) % x != 0)
{
n = k * y;
k += 1;
}
cout << n;
}
}
}
但是它运行得太慢了。请帮助我,我该如何优化它?
好吧,例如,像这样: