https://www.luogu.org/problem/P4318
анализ
М может быть разделен на два требование [1, M] квадрат числа нефакторного
Очевидно, что репелленты могут быть размещены: квадрат числа -1 числа квадрат простого числа простых чисел от 0 до +2 ......
КИУМ легко найти функцию репеллента Mobius
Линейная половина экрана, чтобы предобусловливание
Обратите внимание, что две точки L, R, средний диапазон может превышать LONGLONG
Окончательная формула:
$ ANS = \ сумма _ {= 1} ^ {\ влево \ lfloor \ SQRT {п} \ право \ rfloor} \ мю (I) \ влево \ lfloor \ гидроразрыва {п} {я ^ 2} \ право \ rfloor $
#include <iostream> #include <cstdio> #include <CMATH> с использованием пространства имен станд; ЬурейеЕ долго долго LL; Const INT Inf = 2147483647 ; Const INT N = 46341 ; INT T, K; INT простой [N], Miu [N], CNT; BOOL непростого [N]; аннулированию Prime () { Miu [ 1 ] = 1 ; для ( INT I = 2 ; я <N; я ++ ) { еслипростой [++ CNT] = я, Miu [я] = - (непростой [я]!) 1 ; для ( INT J = 1 , J <= CNT; j ++ ) { если (я * простое [J]> = N) перерыв ; непростой [я * простой [J]] = 1 ; если (я% простой [J] == 0 ) { Miu [я * простое [J]] = 0 ; перерыв ; } Miu [я * простой [J]] = - 1 * MIU [I]; } } } BOOL Check (Л.Л. середине) { LL п = SQRT (середина), ANS = 0 ; для ( INT I = 1 ; г <= п; я ++) ANS + = 1LL * Miu [я] * (середина / (I * I)); вернуться анс> = к; } INT основных () { Prime (); для (Scanf ( " % D " , & T), T; T-- ) { зсапЕ ( " % d " , & к); LL л = 1 , г = Inf, середина, ANS; в то время как (л <= г) { середина = 1LL * (L + R) >> 1 ; если(Проверка (середина)) ANS = середина, г = середина 1; остальной л = середина + 1 ; } Е ( " % LLD \ п " , ANS); } }