Visible Lattice Points SPOJ - VLATTICE

原题链接
考察:容斥原理
思路:
  xOz,yOz,xOy三个面就是当作二维面计算,每次计算*3即可.三维也是利用莫比乌斯函数计算,即容斥原理.

Code

#include <iostream> 
#include <cstring>
using namespace std;
typedef long long LL;
const int N = 1000010;
int prime[N],cnt,mob[N],n;
bool st[N];
void GetPrime(int n)
{
	mob[1] = 1;
	for(int i=2;i<=n;i++)
	{
		if(!st[i]) prime[++cnt] = i,mob[i] = -1;
		for(int j=1;prime[j]<=n/i;j++)
		{
			st[i*prime[j]] = 1;
			if(i%prime[j]==0)
			{
				mob[i*prime[j]] = 0;
				break;
			}
			mob[i*prime[j]] = -1*mob[i];
		}
	}
}
int main()
{
	int T;
	scanf("%d",&T);
	GetPrime(N-1); 
	while(T--)
	{
		scanf("%d",&n);
		LL res = 3;
		for(int i=1;i<=n;i++)
		{
			res+=(LL)mob[i]*(n/i)*(n/i)*(n/i);
			res+=(LL)mob[i]*(n/i)*(n/i)*3;
		}
		printf("%lld\n",res);
	}
	return 0;
}
posted @ 2021-06-15 10:43  acmloser  阅读(23)  评论(0编辑  收藏  举报