BZOJ2818 欧拉函数
题意:求1--n中满足gcd(x,y)的值为质数的数对(x,y)的数目 ( (x,y)和(y,x)算两个 )
sol:
设p[i]是一个质数,那么以下两个命题是等价的:
1.gcd(x,y)=1
2.gcd(x*p[i],y*p[i])=p[i]
eg:gcd(36,25)=1,gcd(36*7,25*7)=7
所以对于1--n的所有质数p[i],求一下1<=x,y<=n/p[i]中所有gcd(x,y)=1的数对的数目即可。
如何求1--r范围内所有互质数对的数目?
考虑欧拉函数φ(x)=1..x中与x互质的数的数目
设x<=y,那么这样就可以求出来了:
for y:= to r do //1不是质数也不是合数,而且1和任意数的gcd都等于1,应该除去
ans+=*phi[y]; //(x,y)和(y,x)算两个
ans++; //这是本题的特殊情况:当x==y时,gcd(y,y)的值也是质数
Solve函数是题解里用的,事先累加了所有2*phi[i],速度要快一点点
Reference: http://blog.csdn.net/acdreamers/article/details/8542292
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
#define LL long long
#define MMX 10000010
int phi[MMX],p[MMX];
LL psum[MMX];
bool pr[MMX];
LL nm,ret,n; void calc_phi(int n) //求1--n的欧拉函数,phi[i]
{ //psum[n]:sum of phi[1..n]*2
for (int i=;i<=n;i++)
phi[i]=;
phi[]=;
for (int i=;i<=n;i++)
if (!phi[i])
for (int j=i;j<=n;j+=i)
{
if (!phi[j]) phi[j]=j;
phi[j]=phi[j]/i*(i-);
}
psum[]=;
for (int i=;i<=n;i++)
psum[i]=psum[i-]+phi[i]*;
} void isprime(LL n) //求1--n的质数。pr[i]=1 : i is a prime
{
nm=;
memset(pr,true,sizeof(pr));
LL m=sqrt(n+0.5);
pr[]=false;
for (LL i=;i<=m;i++)
if (pr[i])
{
for (LL j=i*i;j<=n;j+=i)
pr[j]=false;
}
for (int i=;i<=n;i++)
if (pr[i])
{
nm++;
p[nm]=i;
}
} LL Solve(int n) //
{
LL ans = ;
for(int i=; i<=nm&&p[i]<=n; i++)
ans += + psum[n/p[i]];
return ans;
} int main()
{
cin>>n;
isprime(n);
calc_phi(n); LL ret=;
for (int i=;i<=nm;i++)
{
int r=n/p[i];
for (int j=;j<=r;j++) //注意1不能包括进去,因为gcd(1,?)恒等于1
ret+=*phi[j];
ret++;
}
cout<<ret<<endl; //cout<<endl<<Solve(n)<<endl;
return ;
}
BZOJ2818 欧拉函数的更多相关文章
- Bzoj-2818 Gcd 欧拉函数
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2818 题意:给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x ...
- BZOJ2818: Gcd 欧拉函数求前缀和
给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 如果两个数的x,y最大公约数是z,那么x/z,y/z一定是互质的 然后找到所有的素数,然后用欧拉函数求一 ...
- bzoj2818 Gcd(欧拉函数)
Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. Input 一个整数N Output 如题 Sample Input 4 Sam ...
- 【BZOJ2818】Gcd (欧拉函数)
网址:http://www.lydsy.com/JudgeOnline/problem.php?id=2818 一道数论裸题,欧拉函数前缀和搞一下就行了. 小于n的gcd为p的无序数对,就是phi(1 ...
- 【BZOJ2818】Gcd(莫比乌斯反演,欧拉函数)
题意:给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对 1<=N<=10^7 思路:莫比乌斯反演,同BZOJ2820…… ; ..max]of ...
- 【洛谷】4917:天守阁的地板【欧拉函数的应用】【lcm与gcd】【同除根号优化】
P4917 天守阁的地板 题目背景 在下克上异变中,博丽灵梦为了找到异变的源头,一路打到了天守阁 异变主谋鬼人正邪为了迎击,将天守阁反复颠倒过来,而年久失修的天守阁也因此掉下了很多块地板 异变结束后, ...
- 洛谷P2568 GCD (欧拉函数/莫比乌斯反演)
P2568 GCD 题目描述 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 输入输出格式 输入格式: 一个整数N 输出格式: 答案 输入输出样例 输入 ...
- hdu2588 GCD (欧拉函数)
GCD 题意:输入N,M(2<=N<=1000000000, 1<=M<=N), 设1<=X<=N,求使gcd(X,N)>=M的X的个数. (文末有题) 知 ...
- BZOJ 2705: [SDOI2012]Longge的问题 [欧拉函数]
2705: [SDOI2012]Longge的问题 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 2553 Solved: 1565[Submit][ ...
随机推荐
- SQL Server 2005 安装图解教程(Windows)
因工作需要,好久未安装SQL Server2005,今天安装了一下,特此写下安装步骤留下笔记. 安装前准备: 先安装IIS,再安装SQL Server2005 一.安装 点击安装,如下图: 选择操作系 ...
- 如何获取内联样式的width值
如图,如何获取内联样式的width值 不用attr 用css这样写
- android intent隐式调用之一个应用程序启动另一个应用程序
理解Intent的关键之一是理解清楚Intent的两种基本用法:一种是显式的Intent,即在构造Intent对象时就指定接收者,这种方式与普通的函数调用类似:另一种是隐式的Intent,即Inten ...
- C语言 文件操作9--fgetc()和fputc()
//fgetc()和fputc() #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> # ...
- php基础07:流程控制
<?php //1.PHP foreach循环只适用于数组,并用于遍历数组中的每个键/值对. $colors = array("red","green", ...
- [WEB API] CLIENT 指定请求及回应格式(XML/JSON)
[Web API] Client 指定请求及响应格式(xml/json) Web API 支持的格式请参考 http://www.asp.net/web-api/overview/formats-an ...
- LeetCode 笔记25 Candy (艰难的调试)
There are N children standing in a line. Each child is assigned a rating value. You are giving candi ...
- Linux第五次实验
北京电子科技学院(BESTI) 实 验 报 告 课程:信息安全系统设计基础 班级: 201352 姓名:池彬宁 贺邦 学号:2013521 ...
- sass,compass让开发效率飞起
最近开始学习并且使用,发现使用它写起css来真的是各种爽 安装sass,compass sass是依赖于ruby的,必须先安装Ruby,点击下载 下载完ruby之后,使用命令行安装sass ...
- Cocopod上更新上传自己的开源框架供别人下载
为了更方便的集成第三方框架有了cocopods 的, 当我们有了相对比较好的框架的时候如何更新到cocopods 供他人参考呢? 下面我一步一步带大家开源自己的框架. 第一步 把自己的框架更新到git ...