acm專題學習之數學(一)分解質因數+URAL - 2102

題目:數字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;
}

注意的地方:只用分解質因子會超時,還要剪一下枝優化一下。

總結:太慘了,不會分解質因子,還看錯題意,和別人差了兩道題。所以平時說要多學習,技多不壓身。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章