點此看題面
考慮\(l,r\)範圍很大,我們最多只能篩出\(10^6\),也就是\(o(\sqrt[3]r)\)範圍內的素數。
對於乙個需要求解的\(\mu(x)\),我們可以先把它當中\(\le10^6\)的質因子先全部除去,同時維護出這部分的\(\mu\)值。
而剩下的部分如果不為\(1\),則最多由兩個\(>10^6\)的質因子相乘而得。
如果剩下的是乙個質數(可以用\(millerrabin\)檢測),那麼答案就是在原\(\mu\)值的基礎上再乘個\(-1\)。
如果剩下的是乙個平方數,那麼答案就是\(0\)。
否則,剩下的是兩個不同的大質數,那麼答案就是在原\(\mu\)值的基礎上乘兩次\(-1\),也就是原答案。
前面除質因子的過程最好不要列舉數去找質因子,而是列舉質因子直接掃過區間中的數,這樣就能避免無效列舉。
#include#define tp template#define ts template#define reg register
#define ri reg int
#define con const
#define ci con int&
#define i inline
#define w while
#define n 100000
#define s 1000000
#define ll long long
using namespace std;
int mu[n+5];ll v[n+5];
int pt,p[s+5];i void sieve()
namespace mr//millerrabin素數測試
; i ll qm(con ll& x,con ll& y,con ll& x) //快速乘
i ll qp(ll x,ll y,con ll& x) //快速冪
i bool t(con ll& x,ci p) //二次探測直至不為1
i bool isp(con ll& x) return 1;}//列舉質數檢測
}int main()
洛谷比賽數學題 1
zlh秒的題,我根本不會,出題人欽點此題提高 想來我要爆零了。題面 這題n,a都巨大無比,所以演算法要盡量往k身上靠,先推一波式子 把這裡sigma內的東西拆開得到 第k此項係數c k,k 肯定是1,消去,再換一下i,j列舉順序 這裡就出現了和原式很相似的東西,設乙個二元函式a 剛剛那個式子變為 這...
洛谷3672 小清新簽到題 題解
題目見上面。參考 講真我最開始真不知道求方案數有什麼用。f i j 表示i個數j個逆序對有多少種方案。顯然我們有f i j f i 1 j f i 1 j 1 f i 1 j i 1 就相當於給乙個比序列中所有數都大的數,讓你往裡插。於是令s i j 為字首和,優化成f i j s i 1 j s ...
洛谷 3768 簡單的數學題
根據crash的數字 很容易可以將式子化簡為 begin ans sum limits n sum limits ij i,j sum limits n d 3 sum limits right rfloor mu k k 2 left sum limits right rfloor i right...