bzoj 2705 & 2018 蓝桥国赛第六题 (欧拉函数)

BZOJ 2705:
$sum_{i=1}^{n}gcd(i,n) (nle2^{32})$

2018 蓝桥国赛第六题:
$sum_{i=1}^{i=n}sum_{i=1}^{i=n}gcd (i,j)^2 (nle10^7)$


BZOJ 2705

  • 枚举约数,求$phi$即可
  • 注意枚举$i$的时候还有$frac{n}{i}$
  • 时间复杂度$O(sqrt{n}·log n)$
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

#define ll long long
using namespace std;

ll ans, n;

ll (ll x)
{
ll ans=x;
for(ll i=2;i*i<=x;i++){
if(x&&x%i==0){
ans=ans/i*(i-1);
while(x%i==0)
x/=i;
}
}
if(x>1) ans=ans/x*(x-1);
return ans;
}

int main()
{
scanf("%lld", &n);
int k=int(sqrt(n+0.5));
for(int i=1;i<=k;i++)
{
if(n%i==0)
{
ans += i*(phi(n/i));
if(i*i != n) ans+=n/i * (phi(i));
}
}
printf("%lldn", ans);
}

2018 蓝桥国赛第六题

  • 显然也是枚举约数,但需要$O(n)$线性筛求出$[1,10^7]$的$phi$
  • 时间复杂度$O(n)$