SPOJ VLATTICE Visible Lattice Points (莫比乌斯反演)
2015-10-24 23:55
357 查看
此题意思很简单:在N∗N∗NN*N*N的正方体中,有多少整点不能被(0,0,0)(0,0,0)看到。如果一个点(x,y,z)(x,y,z)不能被(0,0,0)(0,0,0)看到,那么一定有一个节点(x′,y′,z′)(x',y',z')在(0,0,0)(0,0,0)到(x,y,z)(x,y,z)的连线上,那么gcd(x,y,z)!=1gcd(x,y,z)!=1,反之,如果
gcd(x,y,z)=1gcd(x,y,z)=1,那么这个点一定能被看到。
考虑退化情况:x,y,zx,y,z中有一个为00那么只需要满足gcd(x,y)=1gcd(x,y)=1,如果有两个为0,那么只有可能是(0,0,1),(0,1,0),(1,0,0)(0,0,1),(0,1,0),(1,0,0)。
然后情况就变成了一个莫比乌斯水题。
附上代码:
gcd(x,y,z)=1gcd(x,y,z)=1,那么这个点一定能被看到。
考虑退化情况:x,y,zx,y,z中有一个为00那么只需要满足gcd(x,y)=1gcd(x,y)=1,如果有两个为0,那么只有可能是(0,0,1),(0,1,0),(1,0,0)(0,0,1),(0,1,0),(1,0,0)。
然后情况就变成了一个莫比乌斯水题。
附上代码:
#include <bits/stdc++.h> #define LL long long #define FOR(i,x,y) for(int i = x;i < y;++ i) #define IFOR(i,x,y) for(int i = x;i > y;-- i) using namespace std; const int maxn = 1000010; int prime[maxn],mu[maxn]; bool check[maxn]; void Mobius(){ memset(check,false,sizeof(check)); prime[0] = 0; mu[1] = 1; FOR(i,2,maxn){ if(!check[i]){ prime[++prime[0]] = i; mu[i] = -1; } for(int j = 1;j <= prime[0];++ j){ if(i*prime[j] >= maxn) break; check[i*prime[j]] = true; if(i % prime[j]){ mu[i*prime[j]] = -mu[i]; } else{ mu[i*prime[j]] = 0; break; } } } } int n; void work(){ LL res = 0; for(LL d = 1;d <= n;++ d){ res += mu[d]*((n/d)+3LL)*(n/d)*(n/d); } printf("%lld\n",res+3LL); } int main(){ //freopen("test.in","r",stdin); Mobius(); int T; scanf("%d",&T); while(T--){ scanf("%d",&n); work(); } return 0; }
相关文章推荐
- 20151022作业
- Mac 开发者常用的工具
- 第6章深入使用Hibernate 6.5 条件查询
- 深入理解Java内存模型
- 007--C++动态内存(数组)
- javascript中apply、call和bind的区别
- 20135220谈愈敏--信息安全系统设计基础第六周学习总结
- CoolWeather功能完成版小结
- 2015年10月24日作业
- Multiple dex files define Lcom/sina/sso/RemoteSSO
- 搭建一个单纯学习hibernate的项目
- 使用IronPython给.Net程序
- 河北省民间组织管理系统项目分析
- 最近看到一个很不错的特效网站
- C语言-推箱子游戏代码
- bootstrap经验http://v3.bootcss.com/
- Single Round Match 671 Round 1 - Division II, Level Three(状压DP)(略难)
- android robolectric 单元测试的简单使用
- OpenS-CAD, a simple 2D CAD application
- 安卓 OnLongClickListener接口简介 以及案例