UVa 11014 - Make a Crystal

2 篇文章 0 订阅
1 篇文章 0 订阅

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


提示:

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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值