技巧 用唯一分解定理優化因數分解

2022-09-20 20:48:12 字數 2271 閱讀 4896

p3987 我永遠喜歡珂朵莉

儘管它的提交記錄裡滿屏的迴圈展開純抱粒,

但是它的正解是平衡樹+樹狀陣列/線段樹.

之所以用這個技巧優化不只是因為它有雙倍經驗,還有就是昨晚上 \(\tt lzx\) 跑過來求乙個分解 \(n \le 1e15\) 質因數的程式(

然而我下午試了下,打鍋了

for(ri j=1;j*j<=a[i];j++)

}

其實加強版本身就不是用平衡樹實現的,而是並查姬

所以需要優化

然後dpair神仙的求助帖裡我瞄到了我寫鍋的質數分解法

所以就直接上這個了

唯一分解定理:

對於合數\(n\) ,它可以表示為唯一的分解形式

\[n=p_^}p_^}p_^}...p_^}

\],其中

\[p_i \in prime\].

所以 \(n\) 的所有因數在把 \(n\) 進行這樣分解之後就可以組合求出了.

先預處理 \([1,max_n]\) 的質數,這個線性篩一遍

然後對於 \(n_i\) ,用 \(\le \sqrt\) 的質數分解它

最後剩下的一定是 \(> \sqrt\) 的某個質數或者是 \(1\)

因為兩個質數 \(a,b>\sqrt\) 的積一定大於 \(n_i\)

能分解出的 \(>\sqrt\) 的質數最多只有乙個.

這樣就變成了 \(o(\,p+d+q\,)\) , \(p\) 是 \(\sqrt\) 以內的質數個數, \(d=\sum_^ a_i\) 為次數和, \(q\) 是因數個數.

質數比較稀疏,所以要優一點

滯脹分析

實現:

euler(maxa);

for(ri i=1;i<=n;i++) cntr=temp;

} if(t!=1)

for(ri j=2;j<=cntr;j++)

p[fac[j]].push_back(i); //儲存含有因數k的下標i

}

然後稍微卡了一點常,加強版就過了.

//p3987

#include #define lowbit(x) (x&(-x))

#define ri register int

#define maxn 500001

#define ll long long

#define u32 unsigned int

#define g() getchar()

#define pc(a) putchar(a)

#define tp templateusing namespace std;

namespace slowio

tp inline void op(t x)

tp inline void writeln(t x)

tp inline void writesp(t x)

}; using namespace slowio;

int n,m;

int a[maxn];

namespace mt19937; using namespace mt19937;

namespace bitintree

inline ll query(int x)

}; using namespace bitintree;

namespace fhq_treap

int s[maxn],ptr;

inline int build(int l,int r)

inline pii split(int now,int k);

rp ret(0,0);

if(k>=val[now]) else return ret;

}inline int merge(int l,int r) }}

int fac[maxn],cntr;

int main()

euler(maxa);

for(ri i=1;i<=n;i++) cntr=temp;

} if(t!=1)

for(ri j=2;j<=cntr;j++)

p[fac[j]].push_back(i);

} for(ri i=2;i<=maxa;i++)

ri opt,l,r,x;

while(m--) else

writeln(query(r)-query(l-1));

}return 0;

}//好像跑得挺快

唯一質因數分解定理

唯一質因數分解定理 任意乙個合數a僅能以一種方式,寫成如下的乘積形式 a aa p1 times p2 times times pr a aa的因子數 e1 1 e2 1 er 1 e1 1 times e2 1 times times er 1 e1 1 e2 1 er 1 const int n...

唯一分解定理

任意乙個大於1的正整數都能表示成若干個質數的乘積,且表示的方法是唯一的。換句話說,乙個數能被唯一地分解成質因數的乘積。因此這個定理又叫做唯一分解定理。c include include include using namespace std int main int num 32 int local...

唯一分解定理

唯一分解定律 又稱為正整數的唯一分解定理,即 每個大於1的自然數均可寫為質數的積,而且這些素因子按大小排列之後,寫法僅有一種方式。當題目有大數相除,求餘數時,精度要求高時.就要運用唯一分解定律 以下唯一分解定律證明 為了真正地證明,分解質因數的方法是唯一的,我們將再次用到反證法。假設存在某些數,它們...