博主刚刚看完莫比乌斯反演.........
提示:
1. 方法是容斥原理 , 记函数 f [ x ] = { (a , b , c) , gcd(a , b , c) == x }
2. 不难理解 , 题解是Σ u[ x ] * f [ x ](1=< x <= n) , 其中u是一个关于容斥原理中符号的函数 , 就是莫比乌斯函数啦
注意: 莫比乌斯函数的推理方法是根据莫比乌斯求和公式而来的 , Σ u [ d ] = ( n==1 ? 1 : 0) 其中 d | n
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <deque>
#include <stack>
#include <algorithm>
using namespace std;
const int maxn = 210000;
int u[maxn];
int main(int argc, char *argv[]) {
for(int i=1;i<maxn;i++)
{
int target = (i==1?1:0);
int delta = target-u[i];
u[i] = delta;
for(int j=2*i;j<maxn;j+=i) u[j]+= u[i];
}
long long n , Case=0;
while(cin>>n && n)
{
long long res =0;
for(long long i=1;i<=n;i++)
res+= u[i]*(((n/2/i)*2+1)*((n/2/i)*2+1)*((n/2/i)*2+1)-1); // we dont want the (0,0,0) in any one
cout<<"Crystal "<<++Case<<": "<<res<<endl;
}
return 0;
}