题目链接:
题目大意:
给一个 n n ,求满足等式 且 x≤y x ≤ y 的解的对数?
数据范围:
1≤n≤109 1 ≤ n ≤ 10 9
解题思路:
显然
x>n,y>n
x
>
n
,
y
>
n
;所以,令
x=n+a,y=n+b
x
=
n
+
a
,
y
=
n
+
b
;
化简可得 :
n2=ab
n
2
=
a
b
;
那么,问题就跟求
n2
n
2
的约数有关系了。
由唯一分解定理,
n=p1r1⋅p2r2…pkrk
n
=
p
1
r
1
⋅
p
2
r
2
…
p
k
r
k
;
n
n
的约数个数 个。
同理:
n2=p12⋅r1⋅p22⋅r2…pk2⋅rk
n
2
=
p
1
2
⋅
r
1
⋅
p
2
2
⋅
r
2
…
p
k
2
⋅
r
k
;
n2
n
2
的约数
Factorn2=(1+2r1)(1+2r2)…(1+2rk)
F
a
c
t
o
r
n
2
=
(
1
+
2
r
1
)
(
1
+
2
r
2
)
…
(
1
+
2
r
k
)
;
所以,对
n
n
分解质因数就可以了。
PS: 大于
sqrt(n)
s
q
r
t
(
n
)
的质因子如果存在,它的指数必然是
1
1
。
PPS: 对于
x=y
x
=
y
(即
a=b
a
=
b
) 的情况,这种情况只会被计算
1
1
次,其他情况都是成对出现的;也就是说, 一定是一个奇数。当然,从上面的分解情况来看,这个也是成立的。
最后既然要求 x≤y x ≤ y 的对数,那么把 Factorn2 F a c t o r n 2 砍半就可以了。
AC代码:
/**********************************************
*Author* :XzzF
*Created Time* : 2018/3/28 12:28:03
*Ended Time* : 2018/3/28 12:32:04
*********************************************/
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int inf = 1 << 30;
const LL INF = 1LL << 60;
int n, T;
int main()
{
scanf("%d", &T);
for (int cas = 1; cas <= T; cas++) {
scanf("%d", &n);
LL ans = 1;
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
int r = 0;
while (n % i == 0) {
r++;
n /= i;
}
ans = (ans * (2 * (LL)r + 1));
}
}
if (n > 1) ans = (ans * (2 * 1 + 1)); //存在大于sqrt(n)的质数
printf("Scenario #%d:\n", cas);
//printf("%lld\n", (ans + 1) / 2); //砍半
printf("%lld\n\n", ans / 2 + 1);
}
return 0;
}