HDU2588:GCD(欧拉函数的应用)
题目链接:传送门
题目需求: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(欧拉函数的应用)的更多相关文章
- hdu2588 gcd 欧拉函数
GCD Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- 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一定是互质的 然后找到所有的素数,然后用欧拉函数求一 ...
- 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 ...
随机推荐
- listView解决滑动时黑色背景问题
listView.setCacheColorHint(Color.TRANSPARENT);//解决滑动时黑色背景问题 listView滑动时黑色背景问题 原因在于ListView存在缓存颜色机制,因 ...
- 超全面的JavaWeb笔记day23<AJAX>
AJAX AJAX概述 1 什么是AJAX AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”.即使用Javascript语言 ...
- 07python之字符串的常用方法
字符串作为python中常用的数据类型,掌握字符串的常用方法十分必要. 常用知识点: 1.字符串的3种格式化方法 2.字符串的strip()方法 3.字符串的join()方法 4.字符串可以切片 1. ...
- ionic简单路由及页面传参
1)页面跳转及传参方法 angular.module('app.routes', [])//routes路由模型 .config(function($stateProvider, $urlRouter ...
- Unity 的OCulus VR开发遇到的坑---OC版本差异
我作为Unity新人,没有用过Unity5之前的任何版本,不熟悉任何操作.所以,就根据官方推荐,使用了5.1.1版本,然后根据官方版本对应推荐,果断选择下载了PC端的OC的0.6.0.1版本,对应的U ...
- brocadcastReceiver
用来接收广播, 可以根据系统发生的一些时间做出一些处理 系统的一些事件,比如来电,来短信,等等,会发广播:可监听这些广播,并进行一些处理: Android3.2以后,为了安全起见,对于刚安装的应用,需 ...
- 使用reactjs遇到Warning: setState(...): Can only update a mounted or mounting component.
前端数据大部分来源于后端,需要向后端发起异步请求,而在使用reactjs的时候,如果这个组件最初加载的时候就发起这个异步请求,然后在返回结果中进行setState({}),这时候有可能会遇到这个警告: ...
- 剑指offer练习
1.题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. public c ...
- 谷歌Volley网络框架讲解——第一篇
自从公司新招了几个android工程师后,我清闲了些许.于是就可以有时间写写博客,研究一些没来的研究的东西. 今年的谷歌IO大会上,谷歌推出了自己的网络框架——Volley.不久前就听说了但是没有cl ...
- JZOJ.5328【NOIP2017模拟8.22】世界线
Description