1228CをCodeforces。素数と乗算

ポータル

もちろん、答えに$ N $、すべての素数$ p個の$の寄与を考慮することです

右\ \ \ lfloorの\のFRAC {M} {P ^ kは}左rfloor $回の$ P ^ K $する$ [1、M] $は、明らかに$ \を数回発生した検討

だから、$ pを^ k個の$のために、その電流寄与は、$ P ^ {\左\ lfloor \ FRAC {M} {P ^ kの} \右\ rfloor} $が、これは^ {k個の\は、左の$ P \ lfloorではないことに注意しています\次に$ K '<K、P ^ {K'} $寄与について計算のでFRAC {M} {P ^ K}右の\ rfloor} $ \は、でカウントされ

そして、今、$ N $素因数を求めている問題は、明らかに$ N $は限り我々はsqrtの素数\ $をふるいにかけるようすることができます{N} $内のより大きな$ \ sqrtの{N} $、最大1個の素因数であります

それは$長い\長い$を爆発するかもしれない時間がかかる場合があります

#include <iostreamの> 
する#include <cstdioを> 
する#include <アルゴリズム> 
の#include <CStringの> 
する#include <cmath> 
の#include <地図> 
の#include <ベクトル>
 使用して 名前空間STD。
typedefの長い 長いULL。
インラインULLリード()
{ 
    ULL X = 0、F = 1チャー CH = GETCHAR()。
    一方、(CH < ' 0 ' || CH> ' 9 '){ 場合(CH == ')F = - 1CH = GETCHAR()。}
     一方、(CH> = ' 0 ' && CH <= ' 9 '){X =(X << 1)+(X << 3)+(CH ^ 48)。CH = GETCHAR()。}
     戻りのx *のF。
} 
のconst  int型 N = 1E6 + 7、MO = 1E9 + 7 
ULL N、M、ANS = 1 、PRI [N]、TOT。
ベクトル <ULL> V。
BOOL not_pri [N]。
インラインULL KSM(ULLのX、Y ULL)
{ 
    ULL RES = 1 一方、(Y){ 場合(Y&1)RES = RES * X%のMo。X = X * X%のMO; Y >> = 1 }
     戻りRESと、
} 
int型のmain()
{ 
    N =(読み取り)、M = read()は、
    INT、T = SQRT(N)+ 1 int型 I = 2 ; I <= T iが++ 
    { 
        場合(!not_pri [i])とPRI [++のTOT = I。
        INT J = 1 ; J <= T; J ++ 
        { 
            ULL G = iはPRI [j]を*。もし(G> T)休憩; 
            not_pri [G] = 1もし(!(I%PRI [J]))休憩
        } 
    } 
    のためにint型 I = 1 iは++; iが<= TOT 場合((N%!PRI [I]))
        { 
            V.push_back(PRI [I])。
            一方、 N / A =((N%PRI [I])!)PRI [i]は、
        } 
    であれば(N> 1 )V.push_back(N)
    INT LEN = V.size()。
    以下のためにint型 i = 0 ; iがLEN <; iは++ 
    { 
        (ULL今= V [i]は、今<= M;今* = V [i])と
        { 
            ANS = ANS * KSM(V [i]は、M /今や)%のMO。
            もし(M / V [i]が<今)ブレーク// 防止爆符号なしの長い長い
        } 
    } 
    coutの << ANS << てendl;
    リターン 0 ; 
}

 

おすすめ

転載: www.cnblogs.com/LLTYYC/p/11612318.html