UVa10892

来源:互联网 发布:巴铁骗局 知乎 编辑:程序博客网 时间:2024/06/06 09:54

简介:给出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 longusing 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;}