等式(分解質因子求因子個數)
阿新 • • 發佈:2019-02-12
連結:https://www.nowcoder.com/acm/contest/90/F
來源:牛客網
時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 32768K,其他語言65536K
64bit IO Format: %lld
來源:牛客網
時間限制: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個
}
}
}