[luogu 2568] GCD (欧拉函数)
题目描述
给定整数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 (欧拉函数)的更多相关文章
- BZOJ 2818: Gcd [欧拉函数 质数 线性筛]【学习笔记】
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 4436 Solved: 1957[Submit][Status][Discuss ...
- 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 ...
- HDU 2588 GCD (欧拉函数)
GCD Time Limit: 1000MS Memory Limit: 32768KB 64bit IO Format: %I64d & %I64u Submit Status De ...
- 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一定是互质的 然后找到所有的素数,然后用欧拉函数求一 ...
- hdu2588 gcd 欧拉函数
GCD Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- 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 和 ...
- HDU 1695 GCD 欧拉函数+容斥定理 || 莫比乌斯反演
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU 1695 GCD (欧拉函数,容斥原理)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- hdu 1695 GCD (欧拉函数+容斥原理)
GCD Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
随机推荐
- 训练1-D
把一个字符三角形掏空,就能节省材料成本,减轻重量,但关键是为了追求另一种视觉效果.在设计的过程中,需要给出各种花纹的材料和大小尺寸的三角形样板,通过电脑临时做出来,以便看看效果. Input 每行包含 ...
- CentOS 笔记(三) 目录结构
理解CentOS 目录结构 首次登录进入,应该是进入了,run文件夹 通过 cd ../ 进入了,最根节点 通过 ls 显示全部文件夹 通过 pwd 查看当前目录 参考: https://www ...
- android onContextItemSelected和onMenuItemSelected厉害关系
Android 的activity中onCreateOptionsMenu onMenuItemSelected onOptionsItemSelected onCreateContextMenu o ...
- 【hihocoder 1304】搜索一·24点
[题目链接]:http://hihocoder.com/problemset/problem/1304 [题意] [题解] 按照题目给的方法搜索就好; 那个方法很棒啊. 注意除0; 然后是浮点数的比较 ...
- eclipse 去掉Eclipse打开后定期弹出Usage Data Upload对话框
Eclipse 的 UDC 老定期蹦出来说要上传使用数据到 eclipse 官网服务器去除方法: 1.删除 eclipse/plugins 目录下以 org.eclipse.epp.usagedata ...
- 将 excel文件数据导入MySQL数据库中
第一步:先将Excel文件另存为文本文件(制表符分割) 第二步:将生成的txt文件另存,并修改编码格式utf8; 第三步:将文件放到指定位置,或自己想要的位置: G:\city.txt 第四步:避免创 ...
- hive join 优化 --小表join大表
1.小.大表 join 在小表和大表进行join时,将小表放在前边,效率会高.hive会将小表进行缓存. 2.mapjoin 使用mapjoin将小表放入内存,在map端和大表逐一匹配.从而省去red ...
- Unity3D:实现人物转向与移动
在网上有非常多通过射线方式实现的人物行走控制脚本,可是假设仅仅是想通过键盘按键来控制的话.比方进行第三人称视角控制,事实上仅仅须要进行简单的角度变换就可以.思路例如以下: 1.依照顺时针方向设定前.右 ...
- Android中XML解析,保存的三种方法
简单介绍 在Android开发中,关于XML解析有三种方式,各自是: SAX 基于事件的解析器.解析速度快.占用内存少.非常适合在Android移动设备中使用. DOM 在内存中以树形结构存放,因此检 ...
- Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签
转载请注明出处:http://blog.csdn.net/xiaanming/article/details/10766053 之前用JakeWharton的开源框架ActionBarSherlock ...