题目链接:
题意:
#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <bitset>
using namespace std;
typedef long long ll;
const int MAX_N = 2010;
const ll mod = (ll)1 << 30;
int prime_cnt, prime[MAX_N], mu[MAX_N], gcd[MAX_N][MAX_N];
bitset<MAX_N> bs;
void GetMu()
{
prime_cnt = 0;
bs.set();
mu[1] = 1;
for(int i = 2; i < MAX_N; ++i) {
if(bs[i]) {
prime[prime_cnt++] = i;
mu[i] = -1;
}
for(int j = 0; j < prime_cnt && i * prime[j] < MAX_N; ++j) {
bs[i * prime[j]] = 0;
if(i % prime[j]) {
mu[ i * prime[j]] = - mu[i];
}else {
mu[i * prime[j]] = 0;
break;
}
}
}
}
inline int GCD(int a, int b)
{
if(gcd[a][b]) return gcd[a][b];
else return b == 0 ? a : gcd[a][b] = GCD(b, a % b);
}
inline void GetGcd()
{
for(int i = 1; i < MAX_N; i++){
for(int j = i; j < MAX_N; j++) {
gcd[i][j] = gcd[j][i] = GCD(i, j);
}
}
}
inline ll work(int n, int x)
{
ll res = 0;
for(int i = 1; i <= n; ++i) {
if(gcd[i][x] == 1) {
res = (res + (n / i)) % mod;
}
}
return res;
}
inline ll solve(int a, int b, int c)
{
ll res = 0;
int top = min(b, c);
for(int i = 1; i <= a; ++i) {
for(int d = 1; d <= top; ++d){
if(gcd[i][d] == 1) {
ll tmp = 0;
tmp = (ll) (a / i) * mu[d] * work(b / d, i) % mod * work(c / d, i) % mod;
res = ((res + tmp) % mod + mod) % mod;
}
}
}
return res;
}
int main()
{
GetMu();
GetGcd();
int a, b, c;
while(~scanf("%d%d%d", &a, &b, &c)) {
printf("%lld\n", solve(a, b, c));
}
return 0;
}
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- ryyc.cn 版权所有 湘ICP备2023022495号-3
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务