spoj 7001
/***
大意:计算gcd(x,y,z) =1 0<= x, y , z <= n 问有多少个这样的对
莫比乌斯反演:(反演: 用结果推原因)
函数m(m)的定义如下:

莫比乌斯反演:
* f(x) = sigma{g(d)}其中x % d == 0,则g(x) = sigma{miu(d) * f(x/d)}
* f(x) = sigma{g(d)}其中d % x == 0,则g(x) = sigma{miu(d/x) * f(d)}
莫比乌斯反演中miu(x) =
* 1 {x中含有偶数个不同的质因子}
* -1 {x中含有奇数个不同的质因子}
* 0 {其他情况}
本题: 设f(x) = 约数为x 的所有数集合 g(x) = 最大公约数gcd 为x的集合
那么g(x) = siga(mu(d)*f(x/d)) x%d==0
或者 g(x) = siga(mu(d/x) *f(d)) d%x==0
在本题中只包含了x,y,z>1 情况 ,,还应加上退化到3个平面上的情况。。
1、 f(x) = n/x*n/x*n/x;----〉 g(x) = mu[i] *(n/x*n/x*n/x)
2、 加上退化到三个平面 ----〉 g(x) = mu[i]*(n/x+1)*(n/x+1)*(n/x+1)
或者分开求:
1、 三个坐标轴。。3
2、 空间中 n/x* n/x*n/x;
3、 三个坐标平面: n/x*n/x +n/x*n/x +n/x*n/x
**/
1、 第一种方法
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = ;
int pri[maxn];
int prime[maxn];
int mu[maxn];
void pri_mu(){
memset(prime,,sizeof(prime));
int cnt =;
mu[] =;
for(int i=;i<maxn;i++){
if(!prime[i]){
mu[i] =-;
pri[cnt++] = i;
}
for(int j=;j<cnt;j++){
if(i*pri[j]>maxn)
break;
prime[i*pri[j]] = ;
if(i%pri[j]==){
mu[i*pri[j]] =;
break;
}else
mu[i*pri[j]] = -mu[i];
}
}
}
int main()
{
pri_mu();
int t;
cin>>t;
long long n;
while(t--){
cin>>n;
long long ans =;
for(int i=;i<=n;i++)
ans += (long long )mu[i]*((n/i+)*(n/i+)*(n/i+)-);
cout<<ans<<endl;
}
return ;
}
----------------------------------------------------------------------------------------------------------
2、 第二种方法
#include <iostream>
#include <cstring>
using namespace std;
const int maxn = ;
int pri[maxn];
int prime[maxn];
int mu[maxn];
void pri_mu(){
memset(prime,,sizeof(prime));
int cnt =;
mu[] =;
for(int i=;i<maxn;i++){
if(!prime[i]){
mu[i] =-;
pri[cnt++] = i;
}
for(int j=;j<cnt;j++){
if(i*pri[j]>maxn)
break;
prime[i*pri[j]] = ;
if(i%pri[j]==){
mu[i*pri[j]] =;
break;
}else
mu[i*pri[j]] = -mu[i];
}
}
}
int main()
{
pri_mu();
int t;
cin>>t;
long long n;
while(t--){
cin>>n;
long long ans =;
for(int i=;i<=n;i++)
ans += (long long )mu[i]*((n/i)*(n/i)*(n/i+));
cout<<ans<<endl;
}
return ;
}
spoj 7001的更多相关文章
- SPOJ 7001 VLATTICE【莫比乌斯反演】
题目链接: http://www.spoj.com/problems/VLATTICE/ 题意: 1≤x,y,z≤n,问有多少对(x,y,z)使得gcd(x,y,z)=1 分析: 欧拉搞不了了,我们用 ...
- spoj 7001. Visible Lattice Points GCD问题 莫比乌斯反演
SPOJ Problem Set (classical) 7001. Visible Lattice Points Problem code: VLATTICE Consider a N*N*N la ...
- 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 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 Visible Lattice Points 莫比乌斯,分块
题目:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=37193 Visible Lattice Points Time L ...
- SPOJ 7001(莫比乌斯反演)
传送门:Visible Lattice Points 题意:0<=x,y,z<=n,求有多少对xyz满足gcd(x,y,z)=1. 设f(d) = GCD(a,b,c) = d的种类数 : ...
- SPOJ 7001 Visible Lattice Points (莫比乌斯反演)
题意:求一个正方体里面,有多少个顶点可以在(0,0,0)位置直接看到,而不被其它点阻挡.也就是说有多少个(x,y,z)组合,满足gcd(x,y,z)==1或有一个0,另外的两个未知数gcd为1 定义f ...
- spoj 7001 Visible Lattice Points莫比乌斯反演
Visible Lattice Points Time Limit:7000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Su ...
- BZOJ 2588: Spoj 10628. Count on a tree [树上主席树]
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MBSubmit: 5217 Solved: 1233 ...
随机推荐
- Hibernate 配置详解(12) 补充
hibernate.hbm2ddl.import_files_sql_extractor 这个配置项用于补充这篇文章: http://blog.csdn.net/stefwu/article/deta ...
- 第七届河南省赛G.Code the Tree(拓扑排序+模拟)
G.Code the Tree Time Limit: 2 Sec Memory Limit: 128 MB Submit: 35 Solved: 18 [Submit][Status][Web ...
- hdu 5040 BFS 多维化处理图
http://acm.hdu.edu.cn/showproblem.php?pid=5040 跟这一题http://blog.csdn.net/u011026968/article/details/3 ...
- java 类排序
参考文档:Java排序: Comparator vs Comparable 入门 java类经常面临排序问题,据我所知:java提供comparable和comparator两种比较方式: 1. co ...
- 有意思的C宏
在Linux内核.嵌入式代码等传统的C代码里,会有一些难以识别的宏定义.我记得在eCos, UBoot, FFmpeg有一些比较BT的宏定义,很难读懂.对于C++程序员来说,最好将这种难读的宏定义转成 ...
- Lotus Sametime 服务器的安装和配置
IBM Lotus Sametime 是一款强大的实时协作软件,目前最新版本是 7.5.1.通过它,您不仅能够进行网络聊天,而且可以方便地召开网络会议.在网络社区中与其他人进行沟通.了解更多关于 Lo ...
- 贫血模型or领域模型
参考: http://lifethinker.iteye.com/blog/283668 http://www.uml.org.cn/mxdx/200907132.asp http://www.itu ...
- 基于Visual C++2013拆解世界五百强面试题--题2-输出和为一个给定整数的所有组合
请用C语言实现 输出和为一个给定整数的所有组合 启动2012 /* 请用C语言实现 输出和为一个给定整数的所有组合 */ #include <stdio.h> //包含头文件stdio.h ...
- [用UpdateLayeredWindow实现任意异形窗口]
前面提到,我们可以用SetWindowRgn或SetLayeredWindowAttributes实现不规则以及半透明的效果 对于SetWindowRgn,它通过一个Rgn来设置区域,这个Rgn一般可 ...
- HDU 3466 Proud Merchants
题目大意:现在给出商品,有三个参数,记为pi,qi,vi,vi是商品的在你心里价值,pi是商品的价格,qi是你要买商品的时候至少需要的钱然后求可得的最大价值. 单词积累:Merchants 商人 t ...