把N 分解成質數冪的乘積

2021-06-29 14:52:34 字數 2151 閱讀 2280

題面

大意就是把n!分解成質數冪的乘積。

最暴力的方法當然會超時,比如下面這個:

#include

#include

#include

using

namespace

std;

int result[5010];

int main()}}

for(int i=2;i<=n;i++)

}printf("\n");

}}

一想,j沒必要從2迴圈到n啊,由於正在學鍊錶,所以用鍊錶來表達多項式寫了一遍,結果還是超時,**如下:

#include

#include

using namespace std;

typedef struct term

linknode;

void _insert(linknode *&l,int j,int cnt)

if(t==

null

||jcoef)

else t->exo+=cnt;

}void _print(linknode *&l)

printf("\n");

}int main()

if(cnt>

0) _insert(l,j,cnt);}}

_print(l);

}}

沒辦法,只能玩預處理解決找質數的耗時。首先想到的是列舉2~sqrt(n),雖然ac了,但用了828ms,效率有點低。**如下:

#include

#include

#include

#include

using

namespace

std;

typedef

struct term

linknode;

void _insert(linknode *&l,int j,int cnt)

if(t==null||jcoef)

else t->exo+=cnt;

}void _print(linknode *&l)

printf("\n");

}bool flag[5010];

int main()

int m;

scanf("%d",&m);

while(m--)

if(cnt>0) _insert(l,j,cnt);

if(flag[t])}}

}_print(l);

}}

受人啟發,改進了質數的判定,用所謂的「埃氏篩法」。哎,很久之前看過的,都給忘了。不過時間並沒有減少太多,索性又改回用陣列來做吧,

結果發現真的不應該用鍊錶的。效果不錯,降到167ms。**:

#include

#include

#include

#include

using

namespace

std;

#define maxn 5010

int result[maxn];

bool flag[maxn];

int main()

if(!flag[t])}}

}for(int i=2;i<=n;i++)

}printf("\n");

}}

再次受人啟發,看到了神演算法orz,這次直接降到39ms,終於可以消停一會了。不多說,直接上**:

#include

#include

using

namespace

std;

#define maxn 5010

bool flag[maxn];

int biao[maxn];

int main()

int m;

scanf("%d",&m);

while(m--)

if(i>1) printf("*");

if(num==1) printf("%d",biao[i]);

else

printf("%d^%d",biao[i],num);

}printf("\n");

}}

將n分解成連續整數之和

從鍵盤輸入乙個數,然後求出連續整數相加使其和剛好和輸入的數相等。如 15 1 2 3 4 5 15 4 5 6 15 7 8 開始想了很久,並且一直在想計算,比如例舉所有.這肯定能實現,但是效率不高。後來想起了等差數列來計算。這時候就只要尋找合適了首項以及對應的長度即可。對於乙個l個步長為1首項為a...

將乙個偶數分解成質數之和

目標 將乙個偶數,分解成質數之和。public class disintegrateevennumber 判斷乙個正整數是否是質數 public static boolean isprimenum int inputnum else return result 判斷是否是乙個偶數 public st...

php分解字串 php怎麼把字串分解成字元

第一種 arr str split str p arr 結果 總結 這裡直接使用str split 方法來分割,但不幸的是這個方法不支援中文的解析,這裡可以考慮下mb split的分割,而這裡為什麼 小樣 二字會被分割成六個亂碼呢?這裡應該是utf8作怪,utf8中乙個漢字佔3個位元組,gbk和gb...