題目大意:
超級冪:是至少兩個數的冪;
輸出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...