简介:给出n,求lcm(a,b)=n的(a,b)对数
分析:
首先把n质因子分解:
对于任何一个p,都有max(ka,kb)=k
- 当ka=k时,kb的取值范围是0~k(共k+1种选择)
- 当kb=k时,ka的取值范围是0~k(共k+1种选择)
综上所述,针对每一个lcm的质因子,都有2*k+1种方案(ka=kb的情况算一种)
所以
其中1/2是因为只计算a < b的情况,+1是因为要加上a=b=n的情况
//这里写代码片
#include<cstdio>
#include<cstring>
#include<iostream>
#define ll long long
using namespace std;
int sshu[50000],tot=0;
bool no[50000];
int num[50000];
void prime()
{
memset(no,0,sizeof(no));
for (int i=2;i<50000;i++)
{
if (!no[i]) sshu[++tot]=i;
for (int j=1;j<=tot&&sshu[j]*i<50000;j++)
{
no[sshu[j]*i]=1;
if (i%sshu[j]==0) break;
}
}
}
int main()
{
ll n;
prime();
while (scanf("%lld",&n)!=EOF&&n)
{
ll ans=1;
ll nn=n;
for (int i=1;i<=tot&&sshu[i]<=n;i++)
{
int k=0;
while (n%sshu[i]==0)
{
k++;
n/=sshu[i];
}
ans=ans*(ll)(2*k+1);
}
if (n!=1) ans*=2;
ans/=2; ans++;
printf("%lld %lld\n",nn,ans);
}
return 0;
}