1. 程式人生 > >UVa 10892 LCM Cardinality (質因數分解)

UVa 10892 LCM Cardinality (質因數分解)

題目傳送門

題意:輸入一個數n,問若n==LCM(a,b),存在的這種(a,b)共有多少對。

題解:首先先了解一下LCM(a,b)的由來。

將a,b拆分

設max(kai,kbi)=ri;

所以如果a中取ri,則b只能取[0,ri-1],則有ri種;

如果b中取ri,則a只能取[0,ri-1],則有ri種;

如果a,b均取ri,則有1種;

所以對於每個因子pi均有2*ri+1種取法,使得(a,b)為不同對數(包括了(a,b)和(b,a));

#include<iostream>
using namespace std;
int main()
{
    int n;
    while(cin>>n&&n)
    {
        int nn=n;
        int ans=1;
        for(int i=2;i*i<=n;i+=2)
        {
            if(n%i==0)
            {
                int count1=0;
                while(n%i==0)
                {
                    n/=i;
                    count1++;//count1記錄每個因子出現的次數
                }
                ans*=(count1*2+1);
//                cout<<"i: "<<i<<"  count1: "<<count1<<endl;
//                cout<<ans<<endl;
            }
            if(i==2)
                i--;
        }
        if(n>1)//如果存在大質因子,範圍在i*i<=n,之外的,需要再乘3
            ans*=3;
        cout<<nn<<" "<<ans/2+1<<endl;
    }
    return 0;
}