题目描述

给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对.

输入输出格式

输入格式:

一个整数N

输出格式:

答案

输入样例#1:

4

输出样例#1:

4

说明

对于样例(2,2),(2,4),(3,3),(4,2)

1<=N<=10^7

上午用这道题考试(虽然略有区别不过差不多)qwq

用欧拉函数乱推。。。

code:(ac代码)

#include<cstdio>
#define LL long long const int N=10000010;
int n,cnt;
int pri[N],phi[N];
LL ans;
LL qphi[N];
bool vis[N]; void init() {
vis[1]=phi[1]=1;
for(int i=2;i<=n;i++) {
if(!vis[i]) pri[++cnt]=i,phi[i]=i-1;
for(int j=1;j<=cnt && pri[j]*i<=n;j++) {
vis[pri[j]*i]=1;
if(!(i%pri[j])) {phi[i*pri[j]]=phi[i]*pri[j];break;}
else phi[i*pri[j]]=phi[i]*phi[pri[j]];
}
}
for(int i=1;i<=n;i++) qphi[i]=qphi[i-1]+phi[i];//前缀和
} int main() {
scanf("%d",&n);
init();
for(int i=1;i<=cnt;i++)
ans+=(qphi[(n-n%pri[i])/pri[i]]<<1)-1;
//稍微解释:因为每次枚举中有一种情况为(pi,pi) (pi为范围内第i个素数) 应被算作一种其余的都应乘2
//也可以刚开始按乘2算出来最后减去素数个数
printf("%lld",ans);
return 0;
}

code:(考试原代码)

PS:由于考题与本题略有不同不能过本题而且懒得改了,此处仅为记录原考题(即(2,4)与(4,2)视作一种情况)的代码

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<ctime>
#define LL long long
using namespace std; const int N=10000010;
int n,cnt;
LL ans;
int pri[N/10],phi[N];
LL qphi[N];
bool vis[N]; int gcd(int a,int b) {//原始暴力算法(n^2)
return !b?a:gcd(b,a%b);
} void init() {//欧拉筛
vis[1]=1;phi[1]=1;
for(register int i=2;i<=n;i++) {
if(!vis[i]) pri[++cnt]=i,phi[i]=i-1;
for(register int j=1;j<=cnt && pri[j]*i<=n;j++) {
vis[pri[j]*i]=1;
if(i%pri[j]==0) {
phi[i*pri[j]]=phi[i]*pri[j];
break;
}
else phi[i*pri[j]]=phi[i]*phi[pri[j]];
}
}
for(int i=1;i<=n;i++) qphi[i]=qphi[i-1]+phi[i];
} int get(int x) {//高级暴力的二分
if((x<<1)>n) return 0;
int l=1,r=cnt;
while(l<r) {
int mid=(l+r+1)>>1;
if(pri[mid]*x<=n) l=mid;
else r=mid-1;
}
return l;
} int main() {
// freopen("gcd.in","r",stdin);
// freopen("gcd.out","w",stdout);
scanf("%d",&n);
// int be=clock();
init();
// for(register int i=1;i<=n;i++) {//比较快的暴力算法(nlogn)。。
// int x=get(i);
// ans+=x*phi[i];
// }
// printf("%lld",ans);
// ans=0;cout<<endl;
for(register int i=1;i<=cnt;i++) {//能过的~~暴力~~算法(n)
int x=(n-n%pri[i]);
ans+=qphi[x/pri[i]];
}
// cout<<cnt<<endl;
printf("%lld",ans);
// int ed=clock();
// cout<<endl<<ed-be;
return 0;
}

[luogu 2568] GCD (欧拉函数)的更多相关文章

  1. BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】

    2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 4436  Solved: 1957[Submit][Status][Discuss ...

  2. POJ 2773 Happy 2006【GCD/欧拉函数】

    根据欧几里德算法,gcd(a,b)=gcd(a+b*t,b) 如果a和b互质,则a+b*t和b也互质,即与a互质的数对a取模具有周期性. 所以只要求出小于n且与n互质的元素即可. #include&l ...

  3. HDU 2588 GCD (欧拉函数)

    GCD Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit Status De ...

  4. Bzoj-2818 Gcd 欧拉函数

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2818 题意:给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x ...

  5. BZOJ2818: Gcd 欧拉函数求前缀和

    给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. 如果两个数的x,y最大公约数是z,那么x/z,y/z一定是互质的 然后找到所有的素数,然后用欧拉函数求一 ...

  6. hdu2588 gcd 欧拉函数

    GCD Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  7. HDU 1695 GCD 欧拉函数+容斥定理

    输入a b c d k求有多少对x y 使得x在a-b区间 y在c-d区间 gcd(x, y) = k 此外a和c一定是1 由于gcd(x, y) == k 将b和d都除以k 题目转化为1到b/k 和 ...

  8. HDU 1695 GCD 欧拉函数+容斥定理 || 莫比乌斯反演

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

  9. HDU 1695 GCD (欧拉函数,容斥原理)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submis ...

  10. hdu 1695 GCD (欧拉函数+容斥原理)

    GCD Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...

随机推荐

  1. docker 私有仓库的两种方式

    1.使用官方默认的registry镜像构建本地仓库 这种方式适用于小规模的镜像仓库储存,没有Ui界面 (1)docker pull registry (2)docker run -d -p 5000: ...

  2. Hibernate 的核心配置文件

    核心配置文件 <!-- SessionFactory,相当于之前学习连接池配置 --> <session-factory> <!-- 1 基本4项 --> < ...

  3. python简单post信息

    最近学了点关于python的网络爬虫的知识,简单记录一下,这里主要用到了requests库和BeautifulSoup库 Requests is an elegant and simple HTTP ...

  4. 转-----------------------js window.open() 操作

    <% if request("infoid")<>"" then set rs=conn.execute("select * fro ...

  5. rabbitMQ学习笔记(三) 消息确认与公平调度消费者

    从本节开始称Sender为生产者 , Recv为消费者   一.消息确认 为了确保消息一定被消费者处理,rabbitMQ提供了消息确认功能,就是在消费者处理完任务之后,就给服务器一个回馈,服务器就会将 ...

  6. Python Study(02)之 Context Manager

    上下文管理器(context manager)是Python2.5开始支持的一种语法,用于规定某个对象的使用范围.一旦对象进入或者离开该使用范围,会有特殊操作被调用 (比如为对象分配或者释放内存).它 ...

  7. [笔记][Java7并发编程实战手冊]系列文件夹

    推荐学习多线程之前要看的书. [笔记][思维导图]读深入理解JAVA内存模型整理的思维导图文章里面的思维导图或则相应的书籍.去看一遍. 能理解为什么并发编程就会出现故障. Java7并发编程实战手冊 ...

  8. Routh-Hurwitz Criterion 劳斯稳定判据

    Routh-Hurwitz Criterion 为什么仅仅要有一个极点在右半平面,那么系统就不会稳定? 比如H(s) =( 1/(s+1) ) *  ( 1/(s+3) ) * ( 1/(s-2) ) ...

  9. 南邮JAVA程序设计实验1 综合图形界面程序设计

    南邮JAVA程序设计实验1  综合图形界面程序设计 实验目的: 学习和理解JAVA SWING中的容器,部件,布局管理器和部件事件处理方法.通过编写和调试程序,掌握JAVA图形界面程序设计的基本方法. ...

  10. 【C语言】编写函数实现字符串旋转

    //编写函数实现字符串旋转 #include <stdio.h> #include <assert.h> #include <string.h> void reve ...