zoj 3435 spoj 7001 莫比乌斯反演

zoj 3435
题意:
给出3个数a,b,c, 定义一个立方体,这个立方体有a*b*c个点,每个点的坐标都是整数(x,y,z),求经过坐标(1,1,1)和另外任意一个点(x1,y1,z1)的不同的直线有多少条。

限制:
2 <= a,b,c <= 1e6; 有200组数据。

思路:
有3种情况:
1. x1,y1,z1都大于等于2:
问题就变成求1 <= x <= a-1 && 1 <= y <= b-1 && 1 <= z <= c-1 && gcd(x,y,z)=1的三元组有多少对。
用莫比乌斯反演来做。
设f(k)为gcd(x,y,z)=k的三元组(x,y,z)的数目,
设F(k)为gcd(x,y,z)为k的倍数的三元组(x,y,z)的数目,所以F(k)=floor((a-1)/k)*floor((b-1)/k)*floor((c-1)/k),然后加上一个分段就可以解决了。
2. x1,y1,z1中有1个为1
然后问题就退化成2为的互质问题了,同样可以用莫比乌斯反演来做。
3. x1,y1,z1中有2个为1
有3条直线。

分别考虑好3种情况后加起来即可。

/*zoj 3435
  题意:
  给出3个数a,b,c, 定义一个立方体,这个立方体有a*b*c个点,每个点的坐标都是整数(x,y,z),求经过坐标(1,1,1)和另外任意一个点(x1,y1,z1)的不同的直线有多少条。
  限制:
  2 <= a,b,c <= 1e6; 有200组数据。
  思路:
  有3种情况:
  1. x1,y1,z1都大于等于2:
  问题就变成求1 <= x <= a-1 && 1 <= y <= b-1 && 1 <= z <= c-1 && gcd(x,y,z)=1的三元组有多少对。
  用莫比乌斯反演来做。
  设f(k)为gcd(x,y,z)=k的三元组(x,y,z)的数目,
  设F(k)为gcd(x,y,z)为k的倍数的三元组(x,y,z)的数目,所以F(k)=floor((a-1)/k)*floor((b-1)/k)*floor((c-1)/k),然后加上一个分段就可以解决了。
  2. x1,y1,z1中有1个为1
  然后问题就退化成2为的互质问题了,同样可以用莫比乌斯反演来做。
  3. x1,y1,z1中有2个为1
  有3条直线。

  分别考虑好3种情况后加起来即可。
 */
#include
    
    
     
     
#include
     
     
      
      
#include
      
      
       
       
using namespace std;
#define LL long long
const int N=1e6+5;
int mu[N];
//O(nlog(n))
void getMu(){
	for(int i=1;i
       
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值