Spoj 7001 Visible Lattice Points 莫比乌斯,分块

2024-01-28 10:50

本文主要是介绍Spoj 7001 Visible Lattice Points 莫比乌斯,分块,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=37193
Visible Lattice Points
Time Limit: 1368MS Memory Limit: 1572864KB 64bit IO Format: %lld & %llu

Submit Status

Description

Consider a N*N*N lattice. One corner is at (0,0,0) and the opposite one is at (N,N,N). How many lattice points are visible from corner at (0,0,0) ? A point X is visible from point Y iff no other lattice point lies on the segment joining X and Y. 
 
Input : 
The first line contains the number of test cases T. The next T lines contain an interger N 
 
Output : 
Output T lines, one corresponding to each test case. 
 
Sample Input : 




 
Sample Output : 

19 
175 
 
Constraints : 
T <= 50 
1 <= N <= 1000000

Hint

题意:在一个边长为n的正方体内,从原点出发能够接触多少个点。
题解:
莫比乌斯反演。
首先,我们要把答案分三类讨论:
1, 坐标轴上的三个点可以看见(1,0,0)和(0,1,0)和(0,0,1)。
2, 与原点相邻的三个表面的点。在三个表面各反演一次,加起来即可。
3, 在三维空间中反演一次即可。
答案为三种情况的和。
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define MAXN 1000010
 4 #define LL long long
 5 int mu[MAXN+10],prime[80010],qz[MAXN+10],tot;
 6 bitset<MAXN+10> vis;
 7 int read()
 8 {
 9     int s=0,fh=1;char ch=getchar();
10     while(ch<'0'||ch>'9'){if(ch=='-')fh=-1;ch=getchar();}
11     while(ch>='0'&&ch<='9'){s=s*10+(ch-'0');ch=getchar();}
12     return s*fh;
13 }
14 void getmu()
15 {
16     int i,j;
17     mu[1]=1;tot=0;
18     for(i=2;i<=MAXN;i++)
19     {
20         if(vis[i]==0)
21         {
22             prime[++tot]=i;
23             mu[i]=-1;
24         }
25         for(j=1;j<=tot&&prime[j]*i<=MAXN;j++)
26         {
27             vis[prime[j]*i]=1;
28             if(i%prime[j]==0)
29             {
30                 mu[prime[j]*i]=0;
31                 break;
32             }
33             mu[prime[j]*i]=-mu[i];
34         }
35     }
36 }
37 void Qz()
38 {
39     for(int i=1;i<=MAXN;i++)qz[i]=qz[i-1]+mu[i];
40 }
41 LL calc2(int n)//计算平面上的个数.
42 {
43     int d,pos;
44     LL sum=0;
45     for(d=1;d<=n;d=pos+1)
46     {
47         pos=n/(n/d);
48         sum+=(LL)(qz[pos]-qz[d-1])*(n/d)*(n/d);
49     }
50     return sum;
51 }
52 LL calc3(int n)//计算空间里的个数.
53 {
54     int d,pos;
55     LL sum=0;
56     for(d=1;d<=n;d=pos+1)
57     {
58         pos=n/(n/d);
59         sum+=(LL)(qz[pos]-qz[d-1])*(n/d)*(n/d)*(n/d);
60     }
61     return sum;
62 }
63 int main()
64 {
65     int N,T;
66     T=read();
67     getmu();
68     Qz();
69     while(T--)
70     {
71         N=read();
72         printf("%lld\n",calc3(N)+calc2(N)*3+3);
73     }
74     fclose(stdin);
75     fclose(stdout);
76     return 0;
77 }
View Code

 

 

转载于:https://www.cnblogs.com/Var123/p/5285053.html

这篇关于Spoj 7001 Visible Lattice Points 莫比乌斯,分块的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/653417

相关文章

hdu6053 TrickGCD 莫比乌斯反演

TrickGCD Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Problem Description You are given an array  A  , and Zhu wants to know there are how many d

Spring Boot实现大文件分块上传

1.分块上传使用场景 大文件加速上传:当文件大小超过100MB时,使用分片上传可实现并行上传多个Part以加快上传速度。 网络环境较差:网络环境较差时,建议使用分片上传。当出现上传失败的时候,您仅需重传失败的Part。 文件大小不确定: 可以在需要上传的文件大小还不确定的情况下开始上传,这种场景在视频监控等行业应用中比较常见。 2.实现原理 实现原理其实很简单,核心就是客户端把大文件

【SPOJ】1825 Free tour II 点分治

传送门:【SPOJ】1825 Free tour II 题目分析:敲了两遍。。。 本题是论文题,具体见漆子超论文《分治算法在树的路径问题中的应用》。 在以root为根的第 i 棵子树上,我们用G[ i ,j ]表示root的第 i 棵子树的路径上严格有 j 个黑点的路径的最长长度。用F[ i ,j ]表示在root为根的第 i 棵子树的路径上不超过 j 个黑点的路径的最长长度。因

【BNU】40719 Arithmetic Progressions【分块+FFT】

传送门:【BNU】40719 Arithmetic Progressions 题目分析: 用分块+FFT强行AC了这题…… 之前一直TLE……然后改了好久把姿势改的优美点了……终于过了…… 大概思路是:我们考虑分块,假设每一块的大小为S,一共分了B块然后我们分两种情况讨论: 1.第二个数在第i块,第一个数在(1~i-1)块内,第三个数在(i+1~B)块内。 2.至少两个数在同一块内。

【SPOJ】Triple Sums【FFT】

传送门:【SPOJ】Triple Sums 题目分析: 首先我们不考虑 i<j<k i<j<k这个条件,构造多项式: Y=∑xai \qquad\qquad\qquad Y = \sum x^{a_i} 那么 ai+aj+ak=S ai+aj+ak=S的个数即 xai+aj+ak=S x^{a_i+a_j+a_k=S}的个数,等价于 Y3中xS Y^3中x^S的系数。 然后我们考虑容斥

【HDU】5213 Lucky 【分块(在线算法)】

传送门:【HDU】5213 Lucky 题目分析: 我来说一下这题的在线做法。 首先我们将区间分成 n√ \sqrt n块,用f[x][y]表示第x块的数和第y块的数相加等于K的对数,这个可以 O(nn√) O(n \sqrt n)的预处理。然后还有g[x][y]表示在第1~x块中有的大小为y的数的个数,这个的复杂度同样 O(nn√) O(n \sqrt n)。 接下来,对于每组询问,我们

针对大数据的种子点生长——分块生长的策略

前言   在之前的种子点生长系列中,探讨了使用三种提取图像中内容部分种子点生长算法,分别是泛洪法、扫描线法和区段法。我们知道这三种算法在空间上都需要占用三维图像的空间以及相应的位图标记表的空间。有时,我们需要处理一些体积相当大的数据,这些数据都是内存中无法放下的,如数十数百GB的数据,想要获得其中图像内容信息,一般需要对图像进行分块生长。   本文使用一种比较直接的思路对数据进行分块,然

P3313 [SDOI2014] 旅行(分块做法)

~~~~~      P3313 [SDOI2014] 旅行 ~~~~~      总题单链接 思路 ~~~~~      遇到这种树上路径问题,就考虑用重链剖分转为区间问题。 ~~~~~      问题转换为了:给定一个区间和 k k k,求这个区间内信仰为 k k k 的城市的 权值和 或 最大权值。 ~~~~~      这个问题也可以用动态开点线段树解决(现在不会,以后

C# 使用中点查找矩形的角(Find Corners of Rectangle using mid points)

考虑一个矩形 ABCD,我们给出了边 AD 和 BC 中点(分别为 p 和 q)的坐标以及它们的长度 L(AD = BC = L)。现在给定参数,我们需要打印 4 个点 A、B、C 和 D 的坐标。 例子:  输入:p = (1, 0)         q = (1, 2)         L = 2 输出:(0,0),(0,2),(2,2),(2,0) 解释: 打

学习笔记 ---- 莫比乌斯反演总结

文章目录 概述前置知识数论分块狄利克雷卷积积性函数 莫比乌斯函数定义性质 莫比乌斯反演因子形式倍数形式 例题周期性字符串互质数对[NOI2010D1T1]能量采集BZOJ2820 YY的GCD[SDOI2015] 约数个数和BZOJ4407 于神之怒加强版【BZOJ2693】jzptab最小公倍数之和[bzoj3529-Sdoi2014] 数表 练习题51nod 1675 序列变换BZOJ3