

Hãy luôn nhớ cảm ơn và vote 5*
nếu câu trả lời hữu ích nhé!
#include <bits/stdc++.h>
#define ll long long
using namespace std;
bool scp(ll n)
{
ll k = sqrt(n);
return k * k == n;
}
bool check(ll n)
{
for (ll i = 1; i * i <= n; i++)
{
if (n % i == 0)
{
if (i != 1 && scp(i))
return false;
if (n / i != i && scp(n/i))
return false;
}
}
return n > 1;
}
ll demuoc(ll n)
{
int cnt = 0;
for (ll i = 1; i * i <= n; i++)
{
if (n % i == 0)
{
if (check(i))
cnt++;
if (n / i != i)
if (check(n / i))
cnt++;
}
}
return cnt;
}
int main()
{
long long n;
cin >> n;
cout << demuoc(n);
}
Hãy giúp mọi người biết câu trả lời này thế nào?
![]()
Bảng tin
15
1118
2
if (n / i != i && scp(n/i)) tại sao lại là vầy ạ em ko hiểu ạ
2707
41698
2042
Thuật toán của mình là kiểm tra xem các ước của n, có số nào là số không chứa chính phương, bằng cách kiểm tra xem các ước của số đó có số nào là số chính phương hay không
2707
41698
2042
if (n / i != i && scp(n/i)) `->` Đoạn này mình dùng để xác đinh xem n / i != i hay không (phần này thuộc thuật toán đếm ước), còn scp(n/i) là kiểm tra xem n/i có là số chính phương hay không