b = ∏ p 1 k e k b = \prod{p_{1k}^{e_k}} b=∏p1kek
b = ∏ p 2 k e k b = \prod{p_{2k}^{e_k}} b=∏p2kek
l c m = ∏ p 2 k m a x ( e k ) lcm = \prod{p_{2k}^{max(e_k)}} lcm=∏p2kmax(ek)
-
所以对于一个lcm一个数取ek次另一个有(1+ek)总取法 不妨将两种应为不知道两个数的大小所以不妨将两个数看成数对。所以ek对结果贡献为(2*ek+1) 去掉两个取一样的结果
-
总数要除于二
-
(a,b) (b,a)均计算了两次但(N,N) 仅计算了一次
#include<bits/stdc++.h>
using namespace std;
#define fst first
#define sec second
#define sci(num) scanf("%d",&num)
#define scl(num) scanf("%lld",&num)
#define mem(a,b) memset(a,b,sizeof a)
#define cpy(a,b) memcopy(a,b,sizeof b)
typedef long long LL;
typedef pair<int,int> P;
const int MAX_N = 1e7 + 100;
const int MAX_M = 1e6;
bool isp[MAX_N];
int primes[MAX_M];
void init() {
for (int i =2 ;i < MAX_N;i++) {
if (!isp[i]) {
primes[++primes[0]] = i;
for (int j = i + i;j < MAX_N;j+= i) {
isp[j] = true;
}
}
}
}
LL sum(LL N) {
LL ans = 1;
for (int i = 1;i <= primes[0] && N != 1 && N >= primes[i];i++) {
int loc = 0;
while (N % primes[i] == 0 && N != 1) {
N /= primes[i];
loc++;
}
ans = ans *( 2 * loc + 1);
}
if (N > 1) ans *= 3;
ans = ans / 2 + 1;
return ans;
}
int main() {
init();
int T;
sci(T);
for (int cs = 1;cs <= T;cs++) {
LL N;
scl(N);
printf(“Case %d: %d\n”,cs,sum(N));
}
return 0;
}