素篩優化 UVA 11752 超級冪

2021-08-16 15:18:10 字數 1909 閱讀 4027

題目大意:

超級冪:是至少兩個數的冪;

輸出1~2^64-1 的所有超級冪;

解題思路:

首先想到肯定是用素數來篩選,但是不可能用素數來篩選可行解,比如:

素數2,列舉2的冪,在進行比較,絕對超時;

那我們只能將素數用於冪的選擇上也就是素數不選;

但這樣仍然過不了,會越界;

這裡可以使用兩種優化邊界處理方式:

1、我自己是定義了乙個中間變數ans,冪次迴圈列舉的時候,判斷ans是否大於inf/i,i是當前的底數;可以完美處理邊界;

2、這種方式應該是一般思路,就是利用log函式,

因為i^j 要求小於2的64次方-1,但並不能算出大於2^64的數,我們可以用log優化,

log(i^j) <= log(2^64);

j <= 64*log(2)/log(i);

但是這種方式有點缺陷,就是精度不好控制,但這也是日後應該能常用到的方式;

ac**:

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #pragma comment(linker, "/stack:1024000000,1024000000")

using namespace std;

#define maxn 1e5

#define lson l,m,rt<<1

#define rson m+1,r,rt<<1|1

#define ms(x,y) memset(x,y,sizeof(x))

#define mc(x, y) memcpy(x, y, sizeof(x))

#define rep(i,n) for(int i=0;i<(n);i++)

#define repf(i,a,b) for(int i=(a);i<=(b);i++)

#define pii pair#define mp make_pair

#define fi first

#define se second

#define it iterator

#define pb push_back

#define times 10

typedef long long ll;

typedef unsigned long long ull;

typedef long double ld;

const double eps = 1e-10;

const double pi = acos(-1.0);

const ll mod = 1e9+7;

const int inf = 0x3f3f3f3f;

const ull inf = (1<<64) -1;//(ll)1e18+300;

const int maxd = 65555;

int m, n;

int pri[maxd];

int vis[maxd];

int num;

void init() }}

}int main()//cout }

}s.insert(1);

for (it = s.begin(); it != s.end(); it++)

return 0;

}

最大素因子 篩法

描述 greyants最近正在學習數論中的素數,但是現在他遇到了乙個難題 給定乙個整數n,要求我們求出n的最大素因子的序數,例如 2的序數是1,3的序數是2,5的序數是3,以此類推.研究數論是需要很大的耐心的,為了懲罰那些沒有耐心讀完題目的童鞋,我們規定 1的最大素因子序數是0.輸入有多組測試資料,...

線性篩優化

如果我們要找出乙個範圍內的所有質數 素數 該如何處理 1.最簡單的就是乙個n 2的演算法 for int i 2 i n i for int j 2 j i j 2.因為當j j之後是重複的所以優化 for int i 2 i n i for int j 2 j j i j 3.因為我們知道2以後的...

素因子分解 (快速篩法 試除法)

素因子分解的演算法有很多,費馬因子分解 比試除法更加高效,是計算機中廣泛使用的很多更有效的因子分解演算法的基礎。二次篩法和數域篩法用於數百位的十進位制的大數字。而數字越大數域篩法更好。現在暫時僅僅寫了最基礎的試除法,更好的演算法還等著我去學習 include includeusing namespa...