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