Visible Lattice Points
来源:互联网 发布:网狐棋牌源码分析 编辑:程序博客网 时间:2024/05/14 04:00
题意
在一个(N+1)(N+1)(N+1)的空间中,你站在(0,0,0)这个点,问你能看到的格点数
分析
先抛开0不看,则可以看出我们需要求互质数对数量。
但是毕竟是有0的,所以我们应该分类讨论。
以下讨论针对某一点(a,b,c)
当有3个0时
此时即为原点,答案为0
当有2个0时
可以看到(0,0,1)(0,1,0)(1,0,0),答案为3
当有1个0时
此时有三种情况(x,y,0)(x,0,y)(0,x,y)
显然我们讨论其中一种情况,再乘以3即可
令
再令
用莫比乌斯反演,可得
则答案为
当有0个0时
令
再令
用莫比乌斯反演,可得
则答案为
综上
最终答案即为以上之和。
用线性筛法处理莫比乌斯函数的前缀和,用分块的方法,可以在O(n)的时间回答每一个询问。
代码
#include<cstdio>#include<algorithm>using namespace std;const int M=1000000;bool vis[M+5];long long p[M+5];long long mu[M+5];long long sum[M+5];void shai(){ long long cnt=0; mu[1]=sum[1]=1; for(long long i=2;i<=M;i++){ if(!vis[i]){ p[++cnt]=i; mu[i]=-1; } for(long long j=1;j<=cnt&&i*p[j]<=M;j++){ vis[i*p[j]]=1; if(i%p[j]==0) break; mu[i*p[j]]=-mu[i]; } sum[i]=sum[i-1]+mu[i]; }}long long f(long long n){ long long ans=1,last; for(long long i=1;i<=n;i=last+1){ last=n/(n/i); ans+=(sum[last]-sum[i-1])*(n/i)*(n/i); } ans*=3; for(long long i=1;i<=n;i=last+1){ last=n/(n/i); ans+=(sum[last]-sum[i-1])*(n/i)*(n/i)*(n/i); } return ans;}int main(){ shai(); long long t; scanf("%lld",&t); while(t--){ long long n; scanf("%lld",&n); printf("%lld\n",f(n)); }}
阅读全文
0 0
- pku3090 Visible Lattice Points
- poj3090-Visible Lattice Points
- poj3090-Visible Lattice Points
- Visible Lattice Points
- P8 Visible Lattice Points
- poj3090 Visible Lattice Points
- [POJ3090]Visible Lattice Points
- POJ3090 Visible Lattice Points
- Visible Lattice Points
- Visible Lattice Points POJ
- Visible Lattice Points POJ
- pku 3090 Visible Lattice Points
- POJ 3090 Visible Lattice Points
- ZOJ2777 POJ2090 Visible Lattice Points
- poj 3090 Visible Lattice Points
- poj 3090 Visible Lattice Points
- POJ 3090 Visible Lattice Points
- ZOJ 2777 Visible Lattice Points
- 2017年
- 【模拟】【贪心】POJ2709Painter
- @CronExpression表达式
- 实现单用户登录的原理和实践 java
- MySQL批量更新
- Visible Lattice Points
- C++中类类型和基本数据类型的转换
- 康托展开
- java下 dec hex byte数组转换
- java类成员初始化顺序
- gvim常用的配置及插件 -windows
- 第一个完全凭兴趣去搭建的网站
- Linux进程全解7——父进程wait / waitip回收子进程
- maven引入log4j、slf4j冲突,java.…