1. 程式人生 > >等式(分解質因子求因子個數)

等式(分解質因子求因子個數)

連結:https://www.nowcoder.com/acm/contest/90/F
來源:牛客網

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 32768K,其他語言65536K
64bit IO Format: %lld

題目描述

給定n,求1/x + 1/y = 1/n (x<=y)的解數。(x、y、n均為正整數)

輸入描述:

在第一行輸入一個正整數T。
接下來有T行,每行輸入一個正整數n,請求出符合該方程要求的解數。
(1<=n<=1e9)

輸出描述:

輸出符合該方程要求的解數。

思路

1/x+1/y=1/n 
–> 
nx+ny=xy 
–> 

(x-n)*(y-n)=n*n

所以

temp=n * n ,

其實就是求 temp這個數<= n 的因子的個數 
不能直接求 資料太大

分解質因子降低時間複雜度:

每個合數都可以寫成幾個質數相乘的形式,這幾個質數就都叫做這個合數的質因數如果一個質數是某個數的因數,那麼就說這個質數是這個數的質因數。而這個因數一定是一個質數。

而分解質因子法求一個數的因子個數演算法解析:如36,=1*2*2*3*3;設因子2的個數是n個,因子2可以生成n個因子(此例子是2,2*2=4)因子3的個數是m個,可以生成m個因數(3,9),而後生成的因子可以生成n*m個因子(即(2,4)和(3,9)的結合)。因為1也是其因子,所以總共的因數個數是n+m+n*m+1;=n*(m+1)+m+1=(n+1)*(m+1);所以把質因子個數求出來+1再相乘就是所有該數因子的個數。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
    int t;
    ll n,ans,cnt;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld",&n);
        ll temp=n*n;
        ans=1;
        for(int i=2;i*i<=temp;i++)
        {
            cnt=1;
            while(temp%i==0)
            {
                cnt++;
                temp/=i;
            }
            ans*=cnt;
        }
        printf("%lld\n",ans/2+1);//<=n的因子的個數
    }
}

。今天發現如果不能保證數以平方的形式,如求6的質因子,這種寫法就算不出了,看了一本書上求質因子的演算法

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t,n;
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        ll temp=n;
        int p=(int)((double)sqrt(temp)+1);
        for(int i=2;i<=p;i++)
        {
            int cnt=0;
            while(temp%i==0)
            {
                temp/=i;
                cnt++;
            }
        printf("%d %d\n",i cnt);//質因子i的個數是cnt個
        }
    }
}