UVa 11014 - Make a Crystal

博主刚刚看完莫比乌斯反演.........


提示:

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;
}



你可能感兴趣的:(数论,uva,莫比乌斯函数)