题意:
对于一个给定的正整数n ,有多少种本质不同的解满足方程
1x
+
1y
=
1n
(x,y,n∈N*)
n≤1e14
分析:
n =
∏i=1kpcii
包括本质相同的解得个数
ans =
∏i=1k(2∗ci+1)
证明:
x+yxyn(x+y)nxnxx−n=1n=xy=(x−n)y=y
令k=x-n,则x = k + n
∴ 有 n2+knk = y
即 n2k +n=y
∵ y,n,k∈N*
∴ 原式解的个数为 n2 的约数个数
原题要求本质不相同的解的个数为(ans + 1) / 2 (x,y为2n的解只计算了一次)
#include <cstdio>
#include <cstring>
typedef long long LL;
const int N = 1e7 + 10,M = 1e6;
int prime[M],tot;
bool p[N];
void work() {
for (int i = 2;i <= N - 10;i ++) {
if (!p[i]) prime[++ tot] = i;
for (int j = 1;j <= tot;j ++) if (prime[j] * i > N - 10) break;
else p[prime[j] * i] = true;
}
}
int main() {
work();
LL n,ans = 1;
scanf("%lld",&n);
for (int i = 1;i <= tot;i ++) if (prime[i] > n) break;else if (n % prime[i] == 0){
LL t = 0;
while (n % prime[i] == 0) {
t ++;
n /= prime[i];
}
ans *= 2 * t + 1;
}
if (n != 1) ans *= 3;
printf("%lld",(ans + 1) >> 1);
}
考试时脑抽打了个不必要的线筛….