題面
大意就是把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...