題目:數字N(1e18),其分解後(N=a1^p1*a2^p2...),問冪的和(p1+p2+p3...)是否爲20。
思路:
- 暴力+優化:通過觀察1e6*1e6*2^18>2e18,會發現最多隻有一個大於1e6的因子,那麼可以只求1e6範圍內的質因子,然後如果過了1e6後和的數量還爲19,那麼只需要判斷除後剩下的是不是質數。
- 分解質因子+優化:套用分解質因子模板,在後面不可能再有20的範圍進行判斷做個剪枝。
分解質因數:
原理:唯一分解定理,任何一個大於1的自然數n都可以唯一分解成有限個質數的乘積,n=p1^a1 * p2^a2 * ... * pn^a3,其中p1<p2<...<pn均爲質數,它們的指數均爲正整數。所以這道題分解出來的質數是可以確定的。
求質因子模板代碼:
//cnt記錄素數的個數,a數組從小到大記錄素數
int cnt = 0;
for(int i = 2; i*i <= n; i ++)
{
while(n % i == 0)
{
a[cnt ++] = i;
n /= i;
}
}
代碼:
#include <algorithm>
#include <string>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int main()
{
long long int n;
scanf("%lld",&n);
int cnt = 0;
int flag=0;
for(long long int i = 2; i*i <= n; i ++)
{
while(n % i == 0)
{
cnt++;
n /= i;
}
if(cnt>20){
break;
}
if(pow(i+1,20-cnt)>n){
flag=1;
break;
}
}
if(n!=1)cnt++;
if(cnt==20&&!flag){
printf("Yes\n");
}
else {
printf("No\n");
}
return 0;
}
注意的地方:只用分解質因子會超時,還要剪一下枝優化一下。
總結:太慘了,不會分解質因子,還看錯題意,和別人差了兩道題。所以平時說要多學習,技多不壓身。