SPOJ 7001 VLATTICE【莫比乌斯反演】

原创 2016年05月30日 17:44:25

题目链接:

http://www.spoj.com/problems/VLATTICE/

题意:

1x,y,zn,问有多少对(x,y,z)使得gcd(x,y,z)=1

分析:

欧拉搞不了了,我们用莫比乌斯来搞一搞。
同样,我们设
f(d):满足gcd(x,y,z)=dx,y,z均在给定范围内的(x,y,z)的对数。
F(d):满足d|gcd(x,y,z)x,y,z均在给定范围内的(x,y,z)的对数。
显然F(d)=[n/d][n/d][n/d],反演后我们得到

f(x)=x|dμ(d/x)[n/d][n/d][n/d]

直接求解f(1)即可。
特别注意坐标轴上的点和坐标平面上的点。

代码:

/*
-- SPOJ 7001
-- mobius
-- Create by jiangyuzhu
-- 2016/5/30
*/
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <stack>
using namespace std;
typedef long long ll;
#define sa(n) scanf("%d", &(n))
#define sal(n) scanf("%I64d", &(n))
#define pl(x) cout << #x << " " << x << endl
#define mdzz cout<<"mdzz"<<endl;
const int maxn = 1e6 + 5 ;
int tot = 0;
int miu[maxn], prime[maxn], f[maxn];
bool flag[maxn];
void mobius()
{
    miu[1] = 1;
    tot = 0;
    for(int i = 2; i < maxn; i++){
        if(!flag[i]){
            prime[tot++] = i;
            miu[i] = -1;
        }
        for(int j = 0; j < tot && i * prime[j] < maxn; j++){
            flag[i * prime[j]] = true;
            if(i % prime[j]) miu[i * prime[j]] = -miu[i];
            else{
                miu[i * prime[j]] = 0;
                break;
            }
        }
    }
}
int main (void)
{
    mobius();
    int T;sa(T);
    int n;
    for(int kas = 1; kas <= T; kas++){
       scanf("%d", &n);
       ll ans = 3;
       for(int i = 1; i <= n; i++){
         ans += miu[i] * 1ll * (n/ i) * (n / i) * (n / i + 3);
       }
       printf("%lld\n", ans);
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

SPOJ 7001 Visible Lattice Points (数论关于gcd,超经典极力推荐-莫比乌斯反演)

传送门:http://www.spoj.com/problems/VLATTICE/ SPOJ Problem Set (classical) 7001. Visible Lattice P...
  • ilovexiaohao
  • ilovexiaohao
  • 2013年10月06日 15:51
  • 2715

SPOJ 7001 VLATTICE - Visible Lattice Points(莫比乌斯反演)

Description 求经过坐标(0,0,0)和另外任意一个点(x1,y1,z1)的不同的直线有多少条(0...
  • V5ZSQ
  • V5ZSQ
  • 2016年08月03日 12:49
  • 192

spoj 7001 VLATTICE - Visible Lattice Points(莫比乌斯反演)

Consider a N*N*N lattice. One corner is at (0,0,0) and the opposite one is at (N,N,N). How many latt...
  • SSimpLe_Y
  • SSimpLe_Y
  • 2017年08月15日 10:48
  • 365

SPOJ VLATTICE Visible Lattice Points 初入莫比乌斯

题意:求两个点(x,y,z)的连线不经过其他点有几个 解:即为求GCD(x,y,z)为1的点有几个 解一:因为x,y,z均在1~n内,所以可以用欧拉函数解出 解二:莫比乌斯反演 设f[n]为G...
  • trq1995
  • trq1995
  • 2015年07月30日 11:55
  • 712

SPOJ VLATTICE - Visible Lattice Points 莫比乌斯反演

VLATTICE - Visible Lattice Points no tags  Consider a N*N*N lattice. One corner is at (0...
  • u012797220
  • u012797220
  • 2015年03月26日 22:16
  • 946

【SPOJ VLATTICE】Visible Lattice Points——莫比乌斯反演3

Consider a N*N*N lattice. One corner is at (0,0,0) and the opposite one is at (N,N,N). How many latt...
  • huayunhualuo
  • huayunhualuo
  • 2016年05月12日 14:07
  • 257

SPOJ VLATTICE(莫比乌斯反演)

题意: 在一个三维空间中,已知(0,0,0)和(n,n,n),求从原点可以看见多少个点 思路: 如果要能看见,即两点之间没有点,所以gcd(a,b,c) = 1         /*来自kuang...
  • Fun_Zero
  • Fun_Zero
  • 2015年10月31日 15:56
  • 248

莫比乌斯反演1003 SPOJ VLATTICE

题意: 有一个n*n*n的格子,这个格子是(0~n,0~n,0~n)的 从x点能看见y点,代表从x到y连线上没有其他点 问从(0,0,0)能看到多少个点 思路: 之前有个能量收集那道题跟这道...
  • qq_27925701
  • qq_27925701
  • 2016年08月01日 19:58
  • 94

【SPOJ7001】Visible Lattice Points-莫比乌斯反演+分块

【SPOJ7001】Visible Lattice Points-莫比乌斯反演+分块
  • Maxwei_wzj
  • Maxwei_wzj
  • 2017年05月28日 14:11
  • 188

spoj 7001 zoj 3435 莫比乌斯反演

Consider a N*N*N lattice. One corner is at (0,0,0) and the opposite one is at (N,N,N). How many latt...
  • Summer__show_
  • Summer__show_
  • 2017年08月07日 11:43
  • 84
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:SPOJ 7001 VLATTICE【莫比乌斯反演】
举报原因:
原因补充:

(最多只允许输入30个字)