传送门
题意: 就是求1/x + 1/y = 1/n(x <= y),给定n,求x, y的正整数解.
思路:刚那道题是懵逼的, 比赛时也是乱搞的, 后面知道正解了…. (没想到啊), 首先化解原式:
yn + xn = xy -> xy - xn - yn = 0 -> xy - xn - yn + n^2 =n^2 -> (x-n)(y-n) = n^2;
化完这里就应该好想了. 那么解就是n^2的因子个数取值num, ans = (num+1)/2; 因为num 是x和y的全部取值, 所以我们应该/2, 然后有相等的取值, 所以是(num+1)/2, 最重要的还是要化得出来上面那个的最终形式. 也就是学会配方移项来解!
还有就是算n的因子个数最快√n, 但是n^2, 就是n的复杂度了, 直接算肯定会T, 那么我们要利用n^2的特点, 直接还是算n的, ^2就是最后素数因子个数*2即可, ^k次方就是素数因子个数*k, 然后就可以√n求啦.
AC Code
int cal(int n) {
ll ans = 1;
for (int i = 2 ; i*i <= n ; i ++) {
if (n % i == 0) {
int cnt = 0;
while(n % i == 0) {
cnt++;
n /= i;
}
ans *= 2*cnt + 1;
}
}
if (n != 1) ans *= 3;
return (ans+1)/2;
}
void solve()
{
int n;
while(cin >> n) {
cout << cal(n) << endl;
}
}