题目描述

给定整数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. 51nod-独木舟问题

    n个人,已知每个人体重,独木舟承重固定,每只独木舟最多坐两个人,可以坐一个人或者两个人.显然要求总重量不超过独木舟承重,假设每个人体重也不超过独木舟承重,问最少需要几只独木舟?分析:  一个显然的策略 ...

  2. 51nod-活动安排问题

    有若干个活动,第i个开始时间和结束时间是[Si,fi),只有一个教室,活动之间不能交叠,求最多安排多少个活动?分析: 我们就是想提高教室地利用率,尽可能多地安排活动.考虑容易想到的几种贪心策略: (1 ...

  3. Top English interview Q&A

    http://www.hjenglish.com/new/p581292/ vocabulary endeavour [ɪn'devər] relevant ['reləvənt] , efficie ...

  4. Tensorflow读取文件到队列文件

    TensorFlow读取二进制文件数据到队列 2016-11-03 09:30:00      0个评论    来源:diligent_321的博客   收藏   我要投稿 TensorFlow是一种 ...

  5. using_where, Using temporary ,using_filesort 分享

    Using filsort文档中的解释: Mysql需要额外的一次传递,以找出如何按排序顺序检索行,通过根据联接类型浏览所有行并为所有匹配where子句的行保存排序关键字和行的指针来完成排序,然后关键 ...

  6. ASP.NET--Razor-model-compare属性用法

    学习使用model中的compare属性来判断两个密码之间是否相同 [Required] [StringLength(100, ErrorMessage = "The {0} must be ...

  7. 定时器SDK

    定时器是一切SDK的根本,欲写SDK必先确定定时器,定时器效率的高低决定着SDK函数的效率,下面是我个人写的Linux C++服务器端进程SDK中的定时器,部分参照了ACE和RocketMQ定时器的思 ...

  8. JavaScript替换字符串中最后一个字符

    1.问题背景 在一个输入框中,限制字符串长度为12位.利用键盘输入一个数字,会将字符串中最后一位替换,比方:111111111111.再输入一个3,会显示111111111113 2.详细实现 < ...

  9. 【前端福利】用grunt搭建自己主动化的web前端开发环境-完整教程

    jQuery在使用grunt,bootstrap在使用grunt,百度UEditor在使用grunt,你没有理由不学.不用! 1. 前言 各位web前端开发者.假设你如今还不知道grunt或者听说过. ...

  10. java之 ------ 设计思想

    java的设计思想 (设计思想.是须要不断领悟的.. . ) 一.封装 学java的人都知道这是向对象的编程语言,从字面上理解,就是针对对象的一些操作,将具有某一特性的实体封装成一个类或者是将具有一定 ...