もちろん、答えに$ 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 = - 1。CH = 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 ; }