[SPOJ VLATTICE]Visible Lattice Points 数论 莫比乌斯反演
7001. Visible Lattice PointsProblem code: VLATTICE |
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 :
3
1
2
5
Sample Output :
7
19
175
Constraints :
T <= 50
1 <= N <= 1000000
题目大意
给定n*n*n的立方体,每一个整数点除(0。0。0)之外都有一盏灯(抽象理解),问能看到多少盏灯(被盖住的灯不算)
解题思路
莫比乌斯反演/容斥原理的典型应用
用容斥原理来解释就是三个点都能被k整除的个数乘上莫比乌斯系数,求和就可以
而三个点都能被k整除的个数就是floor(n/i)^3
注意到最大数据量为1000000 直接线性处理的办法可能TLE
而(n/i)在后面i>(n/2)的部分结果都为1 能够省去一次次计算,直接按mu的前缀和来处理
则我们就统计同样(n/i)的值是否出现两次。假设出现两次那么我们就開始依照前缀和的方法来处理
不优化 6200ms
优化后 490ms
code
优化前
- #include <cstdio>
- #include <iostream>
- #include <algorithm>
- #include <ctime>
- #include <cctype>
- #include <cmath>
- #include <string>
- #include <cstring>
- #include <stack>
- #include <queue>
- #include <list>
- #include <vector>
- #include <map>
- #include <set>
- #define sqr(x) ((x)*(x))
- #define LL long long
- #define INF 0x3f3f3f3f
- #define PI acos(-1.0)
- #define eps 1e-10
- #define mod 100000007ll
- using namespace std;
- LL n;
- LL com[1000005],pri[1000005],phi[1000005],pn,sum[1000005],mu[1000005];
- LL a[1000005];
- int main()
- {
- memset(com ,0 ,sizeof com);
- mu[1]=1;
- for (int i=2;i<=1000000ll;i++)
- {
- if (com[i]==0)
- {
- phi[i]=i-1;
- pri[++pn]=i;
- mu[i]=-1;
- // printf("%d\n", pri[pn]);
- // system("pause");
- }
- for (int j=1;j<=pn&&pri[j]*i<=1000000ll;j++)
- {
- if (i%pri[j])
- {
- phi[i*pri[j]]=phi[i]*(pri[j]-1);
- com[i*pri[j]]=1;
- mu[i*pri[j]]=-mu[i];
- }
- else
- {
- phi[i*pri[j]]=phi[i]*(pri[j]);
- com[i*pri[j]]=1;
- mu[i*pri[j]]==0;
- break;
- }
- }
- }
- sum[0]=0;
- for (int i=1;i<=1000000ll;i++)
- sum[i]=sum[i-1]+phi[i];
- int T;
- scanf("%d",&T);
- while (T--)
- {
- // n=1000000;
- LL ans=0;
- scanf("%lld",&n);
- for (int i=n;i;i--)
- {
- a[i]=(n/i)*(n/i)*(n/i);
- ans+=a[i]*mu[i];
- }
- printf("%lld\n",ans+(sum[n]*2+1)*3+3);
- }
- return 0;
- }
优化后
- #include <cstdio>
- #include <iostream>
- #include <algorithm>
- #include <ctime>
- #include <cctype>
- #include <cmath>
- #include <string>
- #include <cstring>
- #include <stack>
- #include <queue>
- #include <list>
- #include <vector>
- #include <map>
- #include <set>
- #define sqr(x) ((x)*(x))
- #define LL long long
- #define INF 0x3f3f3f3f
- #define PI acos(-1.0)
- #define eps 1e-10
- using namespace std;
- int mu[1000005];
- int com[1000005];
- int pri[1000005],pn=0;
- int phi[1000005];
- LL presum[1000005];
- int musum[1000005];
- int main()
- {
- memset(com,0,sizeof com);
- presum[1]=0;
- mu[1]=1;
- phi[1]=0;
- for (int i=2;i<=1000000;i++)
- {
- if (com[i]==0)
- {
- pri[++pn]=i;
- mu[i]=-1;
- phi[i]=i-1;
- }
- for (int j=1;j<=pn&&pri[j]*i<=1000000;j++)
- {
- if (i%pri[j])
- {
- mu[i*pri[j]]=-mu[i];
- com[i*pri[j]]=1;
- phi[i*pri[j]]=phi[i]*(pri[j]-1);
- }
- else
- {
- phi[i*pri[j]]=phi[i]*(pri[j]);
- mu[i*pri[j]]=0;
- com[i*pri[j]]=1;
- break;
- }
- }
- presum[i]=presum[i-1]+phi[i];
- musum[i]=musum[i-1]+mu[i];
- }
- int T;
- scanf("%d",&T);
- int a,b,c,d,k;
- while (T--)
- {
- int n;
- LL ans=0;
- scanf("%d",&n);
- int i;
- for (i=1;i<=n;i++)
- if ((n/i)==(n/(i+1))) break;
- else
- ans+=(LL)(n/i)*(n/i)*(n/i)*mu[i];
- for (int j=(n/i);j;j--)
- ans+=(LL)(j)*(j)*(j)*(musum[n/(j)]-musum[n/(j+1)]);
- ans+=(LL)presum[n]*6+6;
- printf("%lld\n",ans);
- }
- return 0;
- }
[SPOJ VLATTICE]Visible Lattice Points 数论 莫比乌斯反演的更多相关文章
- SPOJ VLATTICE Visible Lattice Points(莫比乌斯反演)题解
题意: 有一个\(n*n*n\)的三维直角坐标空间,问从\((0,0,0)\)看能看到几个点. 思路: 按题意研究一下就会发现题目所求为. \[(\sum_{i=1}^n\sum_{j=1}^n\su ...
- SPOJ—VLATTICE Visible Lattice Points(莫比乌斯反演)
http://www.spoj.com/problems/VLATTICE/en/ 题意: 给一个长度为N的正方形,从(0,0,0)能看到多少个点. 思路:这道题其实和能量采集是差不多的,只不过从二维 ...
- SPOJ 7001. Visible Lattice Points (莫比乌斯反演)
7001. Visible Lattice Points Problem code: VLATTICE Consider a N*N*N lattice. One corner is at (0,0, ...
- SPOJ 7001 VLATTICE - Visible Lattice Points(莫比乌斯反演)
题目链接:http://www.spoj.com/problems/VLATTICE/ 题意:求gcd(a, b, c) = 1 a,b,c <=N 的对数. 思路:我们令函数g(x)为g ...
- SPOJ VLATTICE Visible Lattice Points (莫比乌斯反演基础题)
Visible Lattice Points Consider a N*N*N lattice. One corner is at (0,0,0) and the opposite one is at ...
- Visible Lattice Points (莫比乌斯反演)
Visible Lattice Points 题意 : 从(0,0,0)出发在(N,N,N)范围内有多少条不从重合的直线:我们只要求gcd(x,y,z) = 1; 的点有多少个就可以了: 比如 : 点 ...
- SPOJ VLATTICE Visible Lattice Points 莫比乌斯反演 难度:3
http://www.spoj.com/problems/VLATTICE/ 明显,当gcd(x,y,z)=k,k!=1时,(x,y,z)被(x/k,y/k,z/k)遮挡,所以这道题要求的是gcd(x ...
- SPOJ VLATTICE Visible Lattice Points 莫比乌斯反演
这样的点分成三类 1 不含0,要求三个数的最大公约数为1 2 含一个0,两个非零数互质 3 含两个0,这样的数只有三个,可以讨论 针对 1情况 定义f[n]为所有满足三个数最大公约数为n的三元组数量 ...
- SPOJ VLATTICE - Visible Lattice Points 【“小”大数加减】
题目链接 一道比较简单的莫比乌斯反演,不过ans会爆long long,我是用结构体来存结果的,结构体中两个LL型变量分别存大于1e17和小于1e17的部分 #include<bits/stdc ...
随机推荐
- 禁止tomcat扫描jar包的tld文件
禁止tomcat扫描jar包的tld文件tomcat/conf/logging.properties 取消注释org.apache.jasper.compiler.TldLocationsCache. ...
- 【Android】实例 忐忑的精灵
在Android Studio中创建项目,名称为“Animation And Multimedia”,然后在该项目中创建一个Module,名称为“Frame-By-Frame Animation”.在 ...
- poj3009 Curling 2.0 深搜
PS:以前看到题目这么长就没写下去了.今天做了半天,没做出来.准备看题解,打开了网站都忍住了,最后还是靠自己做出来的.算是一点进步吧. 分析: 题目的意思没明白或者理解有偏差都没办法做题.看样例3和样 ...
- objectdatasouce的温故
在做ecxel的时候,需要前台做一个联动的效果. 记录一下这个数据源的用法,大学时候用的,忘得差不多了 首先就是往页面拖拽一个objectdatasouce的控件 然后配置数据源: 选择业务对象(其实 ...
- Embedded之Stack之一
1 Intro When a program starts executing, a certain contiguous section of memory is set aside for the ...
- vue遇到的大坑,h5在ios10版本下不能打开页面
无论是谁,在做事情的过程中总是会遇到学坑,才能成为最后的大神 这个坑不说了,找了半天.希望能帮助到你们 进入build文件夹: 找到webpack.prod.conf.js文件: 在UglifyPlu ...
- 前端面试题总结 -vue
1.active-class是哪个组件的属性? vue-router模块的router-link组件. 2.嵌套路由怎么定义? 在 VueRouter 的参数中使用 children 配置,这样就可以 ...
- Jquery常见操作多选框/复选框/checkbox
1.判断checkbox是否为选中状态: if($("#searchNews").attr("checked")=="checked") { ...
- Python基础(二)数据类型
(一)数字 Python3中的数字类型分为3种,分别是整型,浮点型以及复数. Python2种的数字类型分为4种,分别是整型,长整型,浮点型以及复数. 其中长整型时Python2为应对位数较大的而设置 ...
- Day 20 python基础总复习
一.计算机基础 1.1 计算机基础之编程 编程语言是人与计算机之间交流的介质 编程就是写一堆文件 编程为了奴隶计算机,解放劳动力 1.2 计算机组成原理 CPU 控制器:控制硬件 运算器:逻辑运算和算 ...