void
eular()
{
memset(vis,
0
,
sizeof
(vis));
vis[
0
]=vis[
1
]=
1
;
for
(i=
2
;i*i<=N;i++
)
{
if
(vis[i]==
0
)
{
for
(j=i*i;j<=N;j+=
i)
vis[j]
=
1
;
}
}
//
這段求出了N內的所有素數
for
(i=
1
;i<=N;i++
)
phi[i]
=
i;
for
(i=
2
;i<=N;i++
)
{
if
(vis[i]==
0
)
{
for
(j=i;j<=N;j+=i)
//
這里從i開始,必定能整除i,其倍數也同理
phi[j]=phi[j]/i*(i-
1
);
//
此處注意先/i再*(i-1),否則范圍較大時會溢出
}
}
}
遞歸求歐拉函數
for
(i =
1
; i <= maxn; i++) phi[i] =
i;
for
(i =
2
; i <= maxn; i +=
2
) phi[i] /=
2
;
for
(i =
3
; i <= maxn; i +=
2
)
if
(phi[i] ==
i) {
for
(j = i; j <= maxn; j +=
i)
phi[j]
= phi[j] / i * (i -
1
);
單獨求歐拉函數
unsigned euler(unsigned x)
{
//
就是公式
unsigned i, res=
x;
for
(i =
2
; i < (
int
)sqrt(x *
1.0
) +
1
; i++
)
if
(x%i==
0
)
{
res
= res / i * (i -
1
);
while
(x % i ==
0
) x /= i;
//
保證i一定是素數
}
if
(x >
1
) res = res / x * (x -
1
);
return
res;
}
?
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

