>Link
牛客1022普及T2
>Description
给出一个整数
n
n
n,求出
∑
i
=
1
n
∑
j
=
1
n
∑
k
=
1
n
g
c
d
(
i
,
j
,
k
)
∑_{i=1}^{n}∑_{j=1}^{n}∑_{k=1}^{n}gcd(i,j,k)
∑i=1n∑j=1n∑k=1ngcd(i,j,k)
>解题思路
数据有点水比赛的时候打了一个
n
3
n^3
n3的优化模拟都过了(我是菜鸡==)
正解如下。
将三个∑简化成两个,已知
g
c
d
(
i
,
j
,
k
)
=
g
c
d
(
g
c
d
(
i
,
j
)
,
k
)
gcd(i,j,k)=gcd(gcd(i,j),k)
gcd(i,j,k)=gcd(gcd(i,j),k)
第一个
n
2
n^2
n2循环:枚举
i
i
i和
j
j
j,用一个桶累计相同的gcd出现的次数
第二个
n
2
n^2
n2循环:枚举不同的
g
c
d
(
i
,
j
)
gcd(i,j)
gcd(i,j)和
k
k
k,累加上预处理的出现个数
∗
*
∗三个数的
g
c
d
gcd
gcd
>代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 1005
using namespace std;
int n, a[N], ans;
int gcd (int a, int b)
{
if (!b) return a;
return gcd (b, a % b);
}
int main()
{
scanf ("%d", &n);
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
a[gcd(i, j)]++;
for (int G = 1; G <= n; G++)
for (int k = 1; k <= n; k++)
ans += a[G] * gcd (G, k);
printf ("%d", ans);
return 0;
}