题目链接:传送门

题目需求:Given integers N and M, how many integer X satisfies 1<=X<=N and (X,N)>=M.(2<=N<=1000000000, 1<=M<=N),

题目解析:

求(X,N),不用想要分解N的因子,分解方法如下,我一开始直接分解for(int i=2;i<=n/2;i++),这样的话如果n==10^9,那么直接超时,因为这点失误直接浪费了一中午

的时间,要这么分解for(int i=2;i*i<=n;i++)具体请在代码里面看,然后开始求(X,N)>=M。

这才是核心:

要求有多少个 i 满足gcd(i, N) = d(1<=i<=N)
如果gcd(i, N) = d,则gcd(i/d, N/d) = 1
由于i <= N,所以 i/d <= N/d,转化为求多少个不大于N/d的数与N/d互质,而这就是欧拉函数
所以有phi(N/d)个 i 满足gcd(i, N) = d,所以求gcd(i,N)>=M,就是求N的因子中大于等于M的欧拉函数值,

即gcd(N/d1)+gcd(N/d2)+...+gcd(N/dn),其中di>=M,且为N的因子。

直接写:(都是15ms,这是后台数据的问题,数据多了肯定还是打表快)

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
typedef __int64 ll;
using namespace std;
ll n,m,sum,top,key,M,coun,i;
int f[];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
sum=;
top=;
scanf("%I64d%I64d",&n,&m);
for(i=; i*i<n; i++)
{
if(n%i==)
{
f[top++]=i;
f[top++]=n/i;
}
}
if(i*i==n)//千万别忘了这一句,如16=4*4
{
f[top++]=i;
}
sort(f,f+top);
key=-;
for(i=; i<top; i++)
{
if(f[i]>=m)
{
key=i;
break;
}
}
if(key==-)
{
printf("1\n");
continue;
}
for(i=key; i<top; i++)
{
M=n/f[i];
coun=n/f[i];
for(ll z=; z*z<=M; z++)
{
if(M%z==)
{
coun-=coun/z;
M/=z;
while(M%z==)
M/=z;
}
}
if(M!=) coun-=coun/M;
sum+=coun;
}
printf("%I64d\n",sum);
}
return ;
}

一部分欧拉值打表:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
typedef __int64 ll;
using namespace std;
ll n,m,sum,top,key,i;
int phi[],f[];
void init()
{
memset(phi,,sizeof(phi));
phi[]=;
for(int i=; i<=; i++)
{
if(!phi[i])
{
for(int j=i; j<=; j=j+i)
{
if(!phi[j]) phi[j]=j;
phi[j]-=phi[j]/i;
}
}
}
}
int main()
{
int T;
scanf("%d",&T);
init();
while(T--)
{
sum=;
top=;
scanf("%I64d%I64d",&n,&m);
for(i=; i*i<n; i++)
{
if(n%i==)
{
f[top++]=i;
f[top++]=n/i;
}
}
if(i*i==n)
{
f[top++]=i;
}
sort(f,f+top);
for(i=; i<top; i++)
{
if(f[i]>=m)
{
key=i;
break;
}
}
if(key==-)
{
printf("1\n");
continue;
}
for(ll i=key; i<top; i++)
{
if(n/f[i]<=)
{
sum+=phi[n/f[i]];
continue;
}
ll M=n/f[i];
ll coun=n/f[i];
for(ll z=; z*z<=M; z++)
{
if(M%z==)
{
coun-=coun/z;
M/=z;
while(M%z==)
M/=z;
}
}
if(M!=) coun-=coun/M;
sum+=coun;
}
printf("%I64d\n",sum);
}
return ;
}

大神博客:http://hi.baidu.com/bg1995/item/ef25e3261f584053c38d59a8

HDU2588:GCD(欧拉函数的应用)的更多相关文章

  1. hdu2588 gcd 欧拉函数

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

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

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

  3. 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 ...

  4. HDU 2588 GCD (欧拉函数)

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

  5. Bzoj-2818 Gcd 欧拉函数

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

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

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

  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. 判断字符串String是否为空问题

    一.判断一个字符串str不为空的方法有: 1.str == null; 2."".equals(str): 3.str.length <= 0; 4.str.isEmpty( ...

  2. VC++ : GetIDsOfNames 调用失败,获取的dispid为-1

    今天调试自己的程序,需要调用一个COM组件中的方法,利用GetIDsOfNames获取调用函数对象的DISPID. GetIDsOfNames: 把COM接口的方法名字和参数(可选)映射成一组DISP ...

  3. 使用mysqldump工具对数据库进行全备份

    需求描述: 通过mysqldump工具的--all-databases选项对所有数据库进行备份. 操作过程: 1.通过--all-databases选项对所有的数据库进行备份 [mysql@redha ...

  4. codeforces 547A Mike and Frog

    近期都是这样的题呢. . .... 哎 開始想纯暴力(体如今跳出循环t>=那里.,,,)..,.随着数据变大.. ...(t=499981500166是能够的),,,..,,23333333 超 ...

  5. 安全日志:/var/log/secure

    /var/log/secure 一般用来记录安全相关的信息,记录最多的是哪些用户登录服务器的相关日志,如果该文件很大,说明有人在破解你的 root 密码 [root@localhost ~]$ tai ...

  6. Vitamio与FFmpeg、LGPL、GPL的关系

    转自:http://sun.sanniang.me/2014/04/26/the-relationship-vitamio-with-ffmepg-lgp-gpl Vitamio 使用了 FFmpeg ...

  7. js禁止img拖动

    其实只需要一句代码即可,那就是阻止元素的默认事件: <body> <img src="./../imgs/cat.jpg" id="test" ...

  8. SDWebImage使用,图片加载和缓存

    本文转载至 http://blog.163.com/wzi_xiang/blog/static/659829612012111402812726/     清除缓存: [[SDImageCache s ...

  9. NSFileManager和NSFileHandle(附:获取文件大小 )

    本文转载至:http://www.cnblogs.com/pengyingh/articles/2350345.html 天牛 感谢原创作者的硕果 //file 文件操作 NSFileManager  ...

  10. 剑指offer练习

    1.题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数.  public c ...