題目:
求出所有小於2^64-1的super powers
乙個數n是super powers當 a^i=b^j=n
很顯然,super powers的冪指數一定是和數,素數篩選找出小於64的所有和數,然後列舉底數在2到1<<16範圍之內,因為最小合數4
另外·溢位判斷要注意ceil(64/(log(a)/log(2)))-1這是對於a這個底數而言,最高的不溢位的冪。
題目本身不難,主要是 去重函式的運用!
我也是醉了。。。
在stl中unique函式是乙個去重函式, unique的功能是去除相鄰的重複元素(只保留乙個),其實它並不真正把重複的元素刪除,
是把重複的元素移到後面去了
,然後依然儲存到了原陣列中,然後 返回去重後最後乙個元素的位址,因為unique去除的是相鄰的重複元素,所以一般用之前都會要排一下序。
所以,乙個unique()函式完成功能,還需要 sort()和erase()函式。 即:
sort(ans.begin(),ans.end()); //排序
vector::iterator end_unique =unique(ans.begin(),ans.end());//把重複的數放在陣列末尾
ans.erase(end_unique,ans.end()); // 真正的刪除操作
此題**:
#include #include#include#include#include#include#includeusing namespace std;
typedef unsigned long long ll;
bool p[65];
int num[105],pr[105],tot=0,cnt=0;
vectorans;
ll maxn=(((ll)1<<64)-1);
void prime()
for(int i=2;i<=64;i++)
if(p[i]) num[tot++]=i;
else pr[cnt++]=i;
// printf("tot=%d\n",tot);
// for(int i=0;i::iterator end_unique =unique(ans.begin(),ans.end());
ans.erase(end_unique,ans.end());
// printf("%d\n",ans.size());
for(int i=0;i
素篩優化 UVA 11752 超級冪
題目大意 超級冪 是至少兩個數的冪 輸出1 2 64 1 的所有超級冪 解題思路 首先想到肯定是用素數來篩選,但是不可能用素數來篩選可行解,比如 素數2,列舉2的冪,在進行比較,絕對超時 那我們只能將素數用於冪的選擇上也就是素數不選 但這樣仍然過不了,會越界 這裡可以使用兩種優化邊界處理方式 1 我...
unique 去重函式
unique 函式是乙個去重函式,stl中unique的函式 unique的功能是去除相鄰的重複元素 只保留乙個 還有乙個容易忽視的特性是它並不真正把重複的元素刪除。他是c 中的函式,所以標頭檔案要加 include,具體用法如下 int num 100 unique num,mun n 返回的是n...
unique 去重函式
unique 是c 標準庫函式裡面的函式,位於標頭檔案 include中,其功能是去除相鄰的重複元素 只保留乙個 所以使用前需要對陣列進行排序 該函式的乙個使用方法,對於長度為n陣列arr,unique arr,arr n arr返回的是去重後的陣列長度 那它是怎麼實現去重的呢?刪除?不是,它並沒有...