2012-0005
从 Trac 迁移的文章
这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。
原文章内容如下:
zhan by yxdb
{{{
#include <cstdio>
typedef unsigned long long ull;
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
ull C(int n, int a) {
if (n < a) return 0ULL;
ull ret = 1ULL;
for (int i = 0; i < a; ++i) {
ret *= n-i;
ret /= i+1;
}
return ret;
}
int main() {
int n, m;
while (2==scanf("%d%d",&n,&m)) {
ull ans = C((n+1)*(m+1), 3) - (m+1)*C(n+1,3) - (n+1)*C(m+1,3);
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
int k = gcd(i, j);
ans -= 2ULL*(k-1)*(n-i+1)*(m-j+1);
}
}
printf("%llu\n", ans);
}
}
}}}
zhan by yxdb
#include <cstdio>
typedef unsigned long long ull;
int gcd(int a, int b) {
return b ? gcd(b, a % b) : a;
}
ull C(int n, int a) {
if (n < a) return 0ULL;
ull ret = 1ULL;
for (int i = 0; i < a; ++i) {
ret *= n-i;
ret /= i+1;
}
return ret;
}
int main() {
int n, m;
while (2==scanf("%d%d",&n,&m)) {
ull ans = C((n+1)*(m+1), 3) - (m+1)*C(n+1,3) - (n+1)*C(m+1,3);
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
int k = gcd(i, j);
ans -= 2ULL*(k-1)*(n-i+1)*(m-j+1);
}
}
printf("%llu\n", ans);
}
}