BZOJ 2818 Gcd (莫比乌斯反演 或 欧拉函数)
2818: Gcd
Time Limit: 10 Sec Memory Limit:
256 MB
Submit: 2534 Solved: 1129
[Submit][Status][Discuss]
Description
给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的
数对(x,y)有多少对.
Input
一个整数N
Output
如题
Sample Input
Sample Output
HINT
hint
对于例子(2,2),(2,4),(3,3),(4,2)
1<=N<=10^7
Source
题目链接: id=2818">http://www.lydsy.com/JudgeOnline/problem.php? id=2818
题目分析:两种姿势,莫比乌斯反演或者欧拉函数,先说简单的方法。欧拉函数,由于仅仅有一个上界n,所以变换一下1 <= x / p, y / p <= n / p,GCD(x / p, y / p) == 1,
直接求欧拉函数,令num[i]表示1到i中 1<=x,y<=i 且gcd(x,y) == 1个对数,显然有num[i] = 1 + phi[j] * 2,(1 < j <= i),这个1指的是(1, 1)。乘2是由于(1, 2) (2, 1)算两个不同的,那么最后依据我们先前变换的公式。累加num[n / p]的值就可以
#include <cstdio>
#include <cstring>
#define ll long long
int const MAX = 1e7 + 5;
int p[MAX], phi[MAX];
bool prime[MAX];
ll num[MAX];
int pnum; void get_eular(int n)
{
pnum = 0;
memset(prime, true, sizeof(prime));
for(int i = 2; i <= n; i++)
{
if(prime[i])
{
p[pnum ++] = i;
phi[i] = i - 1;
}
for(int j = 0; j < pnum && i * p[j] <= n; j++)
{
prime[i * p[j]] = false;
if(i % p[j] == 0)
{
phi[i * p[j]] = phi[i] * p[j];
break;
}
phi[i * p[j]] = phi[i] * (p[j] - 1);
}
}
} int main()
{
int n;
ll ans = 0;
scanf("%d", &n);
get_eular(n);
num[1] = 1;
for(int i = 2; i <= n; i++)
num[i] = num[i - 1] + 2 * phi[i];
for(int i = 0; i < pnum; i++)
if(n / p[i] > 0)
ans += num[n / p[i]];
printf("%lld\n", ans);
}
这题也能够用莫比乌斯反演做。还是做上述变换。1 <= x / p, y / p <= n / p,GCD(x / p, y / p) == 1,这样的题真的做烂了,懒得说了直接贴
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ll long long
using namespace std;
int const MAX = 1e7 + 5;
int mob[MAX], p[MAX], sum[MAX];
bool prime[MAX];
int pnum; void Mobius(int n)
{
pnum = 0;
memset(prime, true, sizeof(prime));
memset(sum, 0, sizeof(sum));
mob[1] = 1;
sum[1] = 1;
for(int i = 2; i <= n; i++)
{
if(prime[i])
{
p[pnum ++] = i;
mob[i] = -1;
}
for(int j = 0; j < pnum && i * p[j] <= n; j++)
{
prime[i * p[j]] = false;
if(i % p[j] == 0)
{
mob[i * p[j]] = 0;
break;
}
mob[i * p[j]] = -mob[i];
}
sum[i] = sum[i - 1] + mob[i];
}
} ll cal(int n)
{
ll res = 0;
for(int i = 1, last = 0; i <= n; i = last + 1)
{
last = n / (n / i);
res += (ll) (n / i) * (n / i) * (sum[last] - sum[i - 1]);
}
return res;
} int main()
{
int n;
ll ans = 0;
scanf("%d", &n);
Mobius(n);
for(int i = 0; i < pnum; i++)
if(n / p[i] > 0)
ans += cal(n / p[i]);
printf("%lld\n", ans);
}
BZOJ 2818 Gcd (莫比乌斯反演 或 欧拉函数)的更多相关文章
- $BZOJ$2818 $gcd$ 莫比乌斯反演/欧拉函数
正解:莫比乌斯反演/欧拉函数 解题报告: 传送门$QwQ$ 一步非常显然的变形,原式=$\sum_{d=1,d\in prim}^{n}\sum_{i=1}^{n}\sum_{j=1}^{n}[gcd ...
- 【BZOJ2818】Gcd(莫比乌斯反演,欧拉函数)
题意:给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对 1<=N<=10^7 思路:莫比乌斯反演,同BZOJ2820…… ; ..max]of ...
- UVa 10214 (莫比乌斯反演 or 欧拉函数) Trees in a Wood.
题意: 这道题和POJ 3090很相似,求|x|≤a,|y|≤b 中站在原点可见的整点的个数K,所有的整点个数为N(除去原点),求K/N 分析: 坐标轴上有四个可见的点,因为每个象限可见的点数都是一样 ...
- 【BZOJ2226】[Spoj 5971] LCMSum 莫比乌斯反演(欧拉函数?)
[BZOJ2226][Spoj 5971] LCMSum Description Given n, calculate the sum LCM(1,n) + LCM(2,n) + .. + LCM(n ...
- Bzoj 2818: Gcd(莫比乌斯反演)
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MB Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的 数对 ...
- Bzoj 2818: Gcd 莫比乌斯,分块,欧拉函数,线性筛
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3241 Solved: 1437[Submit][Status][Discuss ...
- LightOJ 1375 - LCM Extreme 莫比乌斯反演或欧拉扩展
题意:给出n [1,3*1e6] 求 并模2^64. 思路:先手写出算式 观察发现可以化成 那么关键在于如何求得i为1~n的lcm(i,n)之和.可以知道lcm(a,b)为ab/gcd(a,b) 变换 ...
- BZOJ 最大公约数 (通俗易懂&效率高&欧拉函数)
题目 题目描述 给定整数\(N\),求\(1 \le x,y \le N\)且\(gcd(x,y)\)为素数的数对\((x,y)\)有多少对. \(gcd(x,y)\)即求\(x,y\)的最大公约数. ...
- BZOJ 2705: [SDOI2012]Longge的问题 [欧拉函数]
2705: [SDOI2012]Longge的问题 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 2553 Solved: 1565[Submit][ ...
随机推荐
- Node.js:Strea
ylbtech-Node.js:Stream 1.返回顶部 1. Node.js Stream(流) Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请 ...
- 10.TCPIP监听器
给它做代理之后你这个端口是什么? 做一个代理. Local monitoring port:本地的监听端口.你要给谁做代理,那么给它做代理之后,你这个代理的端口是什么? 现在要给百度做一个代理. 能看 ...
- [JavaEE] Spring事务配置的五种方式
前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. ...
- Java设计模式-策略模式详解
前言 在软件领域中,设计模式作为一种经典的开发实践常常需要我们去深入的理解,而策略模式作为设计模式的一种,使用频率也是相对来说比较高的,在Java中,当我们学习TreeSet集合的时候,就采用了经典的 ...
- Cracking the Coding Interview 6.2
There is an 8*8 chess board in which two diagnolly opposite corners have been cut off. You are given ...
- Unity3d 销毁
using UnityEngine; using System.Collections; public class destroy : MonoBehaviour { void Start () { ...
- intelij idea+springMVC+spring+mybatis 初探(持续更新)
intelij idea+springMVC+spring+mybatis 初探(持续更新) intellij 创建java web项目(maven管理的SSH) http://blog.csdn.n ...
- 集成Bmob推送
Write By lz: 转发请注明原文地址: http://www.cnblogs.com/lizhilin2016/p/6952217.html Lz 寄语: Bmob 奇葩推送, 大坑, 想要 ...
- MFC知识点总结
一:消息1.什么是消息?消息是驱动windows系统运行的基础.从计算机的角度来看,消息就是一个整数. (1)一个无符号整数,是消息值: (2)消息附带的WPARAM和LPARAM类型的参 ...
- todo reading
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Function/bind https ...