Pairs Forming LCM
题解:考虑唯一分解定理:a=p1n1⋅p2n2...pknka = {p_1}^{n_1}\cdot {p_2}^{n_2}...{p_k}^{n_k}a=p1n1⋅p2n2...pknk,b=p1m1⋅p2m2...pkmkb = {p_1}^{m_1}\cdot {p_2}^{m_2}...{p_k}^{m_k}b=p1m1⋅p2m2...pkmk
{lcm(a,b)=p1max(n1,m1)⋅p2max(n2,m2)...pkmax(nk,mk)gcd(a,b)=p1min(n1,m1)⋅p2min(n2,m2)...pkmin(nk,mk)\begin{cases}lcm(a,b) = {p_1}^{max(n_1,m_1)}\cdot {p_2}^{max(n_2,m_2)}...{p_k}^{max(n_k,m_k)}\\\\gcd(a,b) = {p_1}^{min(n_1,m_1)}\cdot {p_2}^{min(n_2,m_2)}...{p_k}^{min(n_k,m_k)}\end{cases}⎩⎪⎨⎪⎧lcm(a,b)=p1max(n1,m1)⋅p2max(n2,m2)...pkmax(nk,mk)gcd(a,b)=p1min(n1,m1)⋅p2min(n2,m2)...pkmin(nk,mk)
所以我们考虑将nnn质因子分解n=p1e1⋅p2e2...pkekn = {p_1}^{e_1}\cdot {p_2}^{e_2}...{p_k}^{e_k}n=p1e1⋅p2e2...pkek,有ei=max(ni,mi)e_i = max(n_i,m_i)ei=max(ni,mi)。
对于i=p1n1⋅p2n2...pknki = {p_1}^{n_1}\cdot {p_2}^{n_2}...{p_k}^{n_k}i=p1n1⋅p2n2...pknk时和j=p1m1⋅p2m2...pkmkj = {p_1}^{m_1}\cdot {p_2}^{m_2}...{p_k}^{m_k}j=p1m1⋅p2m2...pkmk时的每一个质因子的指数我们都有max(ni,mi)+1max(n_i,m_i) + 1max(ni,mi)+1种取法,再除去i=x⋅pmi = x\cdot p^mi=x⋅pm和j=x⋅pnj= x\cdot p^nj=x⋅pn的情况,因此总共就是2(ei+1)−12(e_i+1) - 12(ei+1)−1种,然后又根据乘法原理有∏(2⋅ei+1)\prod{(2\cdot e_i+1)}∏(2⋅ei+1),最后除去i>ji>ji>j和加上指数相等的情况,就有ans=∏2⋅ei+12+1ans = \frac{\prod{2\cdot e_i + 1}}{2} + 1ans=2∏2⋅ei+1+1。
代码
#include<bits/stdc++.h>
typedef long long LL;
using namespace std;
const int N = 1E7+10, M = N / log(N) + N/10;
int prime[M], k;
bool vis[N];
void init()
{
for(int i = 2; i < N; ++i) {
if(vis[i] == 0)
prime[k++] = i;
for(int j = 2; j * i < N; ++j) {
if(vis[i * j] == 0)
vis[i * j] = 1;
}
}
}
LL solve(LL n)
{
LL t = n, ans = 1;
for(int i = 0; i < k && prime[i] <= sqrt(t); ++i) {
int cnt = 0;
while(n % prime[i] == 0) {
cnt++;
n /= prime[i];
}
ans *= (2 * cnt + 1);
}
if(n > 1) ans *= (2 * 1 + 1);
return ans / 2 + 1;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("input.in","r",stdin);
#endif
init();
int T, t = 1;
cin >> T;
while(T--) {
LL n;
cin >> n;
LL ans = solve(n);
cout << "Case "<< t++ << ": " << ans << endl;
}
return 0;
}