从HDU2588:GCD 到 HDU5514:Frogs (欧拉公式)
(a,b) can be easily found by the Euclidean algorithm. Now Carp is considering a little more difficult problem:
Given integers N and M, how many integer X satisfies 1<=X<=N and (X,N)>=M.
InputThe first line of input is an integer T(T<=100) representing the number of test cases. The following T lines each contains two numbers N and M (2<=N<=1000000000, 1<=M<=N), representing a test case.OutputFor each test case,output the answer on a single line.Sample Input
3
1 1
10 2
10000 72
Sample Output
1
6
260
题意:求有多少个1<=X<=N,满足gcd(X,N)>=M。
思路:即求Σd=gcd(X,N)>=M;枚举d,而d是M的因子,不超过根号N个;对枚举的d,用欧拉公式求得有多少个X满足gcd(X,N)=d;
#include<bits/stdc++.h>
using namespace std;
const int maxn=;
int p[maxn+],vis[maxn+],phi[maxn],cnt;
void getprime()
{
phi[]=;
for(int i=;i<=maxn;i++){
if(!vis[i]) p[++cnt]=i,phi[i]=i-;
for(int j=;j<=cnt&&i*p[j]<=maxn;j++){
vis[i*p[j]]=; phi[i*p[j]]=phi[i]*(p[j]-);
if(i%p[j]==){
phi[i*p[j]]=phi[i]*p[j];
break;
}
}
}
}
int tot,ans,fac[maxn];
void divide(int x)
{
for(int i=;i*i<=x;i++){
if(x%i==){
fac[++tot]=i;
if(i*i!=x) fac[++tot]=x/i;
}
}
}
map<int,int>PHI;
int getphi(int x)
{
if(x<=maxn) return phi[x];
if(PHI[x]) return PHI[x];
int res=x;
for(int i=;i*i<=x;i++)
if(x%i==) {
res=res/i*(i-);
while(x%i==) x/=i;
}
if(x>) res=res/x*(x-);
PHI[x]=res;
return res;
}
int main()
{
getprime();
int T,N,M,i,j;
scanf("%d",&T);
while(T--){
tot=ans=;
scanf("%d%d",&N,&M);
divide(N);
for(i=;i<=tot;i++){
if(N/fac[i]>=M) ans+=getphi(fac[i]);
}
printf("%d\n",ans);
}
return ;
}
---------------------------------分界线--------------------------------
再来看HDU5514。。。(虽然复杂度看似有些巧合)。
只要枚举M的因子,然后验证如果是属于某个gcd(a,M)的倍数,就可以累加其所到位子,求和的时候利用对称性,有公式Σ=φ(x)*m/2;。
(容斥定理也可以做,但是我想不出来)。。。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=;
int p[maxn+],vis[maxn+],phi[maxn],cnt;
void getprime()
{
phi[]=; phi[]=;
for(int i=;i<=maxn;i++){
if(!vis[i]) p[++cnt]=i,phi[i]=i-;
for(int j=;j<=cnt&&i*p[j]<=maxn;j++){
vis[i*p[j]]=; phi[i*p[j]]=phi[i]*(p[j]-);
if(i%p[j]==){
phi[i*p[j]]=phi[i]*p[j];
break;
}
}
}
}
int tot,fac[maxn];
void divide(int x)
{
for(int i=;i*i<=x;i++){
if(x%i==){
fac[++tot]=i;
if(i*i!=x) fac[++tot]=x/i;
}
}
}
int getphi(int x)
{
if(x<=maxn) return phi[x];
int res=x;
for(int i=;i*i<=x;i++)
if(x%i==) {
res=res/i*(i-);
while(x%i==) x/=i;
}
if(x>) res=res/x*(x-);
return res;
}
int a[maxn],N,M;
bool check(int x)
{
for(int i=;i<=N;i++)
if(x%a[i]==) return true;
return false;
}
int main()
{
getprime();
int T,Case=,i; ll ans;
scanf("%d",&T);
while(T--){
tot=ans=;
scanf("%d%d",&N,&M);
for(i=;i<=N;i++){
scanf("%d",&a[i]);
a[i]=__gcd(a[i],M);
}
divide(M);
for(i=;i<=tot;i++){
if(fac[i]!=M&&check(fac[i])) ans+=(ll)getphi(M/fac[i])*M/;
}
printf("Case #%d: %lld\n",++Case, ans);
}
return ;
}
从HDU2588:GCD 到 HDU5514:Frogs (欧拉公式)的更多相关文章
- HDU5514 Frogs
/* HDU5514 Frogs http://acm.hdu.edu.cn/showproblem.php?pid=5514 容斥原理 * * */ #include <cstdio> ...
- hdu2588 GCD (欧拉函数)
GCD 题意:输入N,M(2<=N<=1000000000, 1<=M<=N), 设1<=X<=N,求使gcd(X,N)>=M的X的个数. (文末有题) 知 ...
- HDU2588 GCD(欧拉函数)
题目问[1,n]中与n的gcd大于等于m的数的个数. 好难想... 假设x满足条件,那么gcd(x,n)=d>=m,而x/d与n/d一定互质. 又x<=n,所以x/d<=n/d. 于 ...
- hdu2588 gcd 欧拉函数
GCD Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- HDU2588:GCD(欧拉函数的应用)
题目链接:传送门 题目需求:Given integers N and M, how many integer X satisfies 1<=X<=N and (X,N)>=M.(2& ...
- hdu2588 GCD
GCD Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submiss ...
- hdu2588 GCD 给定n,m。求x属于[1,n]。有多少个x满足gcd(x,n)>=m; 容斥或者欧拉函数
GCD Time Limit: / MS (Java/Others) Memory Limit: / K (Java/Others) Total Submission(s): Accepted Sub ...
- 【做题】hdu5514 Frogs——另类容斥
题意是给出n个m的约数,问[0,m-1]中至少被其中一个约数整除的整数和.(n<=10000,m<=1000000000) 直接容斥的话,是2^n再拖个log的复杂度,加上当前的数大于m时 ...
- hdu 5514 Frogs 容斥思想+gcd 银牌题
Frogs Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
随机推荐
- Flask上下文管理及源码刨析
基本流程概述 - 与django相比是两种不同的实现方式. - django/tornado是通过传参数形式实现 - 而flask是通过上下文管理, 两种都可以实现,只不实现的方式不一样罢了. - 上 ...
- CentOS下 Nginx1.13.5 + PHP7.1.10 + MySQL5.7.19 源码编译安装
一.安装Nginx ①安装依赖扩展 # yum -y install wget openssl* gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng l ...
- Sublime Text 3图标更改
Sublime Text 3图标更改 步骤: 1.下载ico图标 2.然后更改图标 注意:重点讲解下,如何将png文件转换为ico图标: 网络上单独找sublime text 3的ico图标比较不好找 ...
- 20145204《Java程序设计》第8周学习总结
20145204 <Java程序设计>第8周学习总结 教材学习内容总结 java.util.logging包提供了日志功能相关类与接口,不必额外配置日志组件,就可以在java平台中使用.使 ...
- Dijkstra算法补分
要求 Dijkstra算法,求解附图顶点A的单源最短路径 在纸上画出求解过程,上传截图(注意图上要有自己的学号和姓名) 过程
- Makefile解析(最简单的LED)
①led_sp.bin: start.o led.o #led_sp.bin是由 start.o 和 led.o 生成 ②arm-linux-ld -Ttext 0x0 -o led_sp.elf $ ...
- 【Rest】在Dubbo中开发REST风格的远程调用(RESTful Remoting)
目录 概述 REST的优点 应用场景 快速入门 标准Java REST API:JAX-RS简介 REST服务提供端详解 HTTP POST/GET的实现 Annotation放在接口类还是实现类 J ...
- 一些常用的JavaScript正则表达式
1.正数,最多n位小数 /^(([1-9]\d*(\.\d{1,n})?)|(0\.\d{1,n}))$/ 2.手机号码 /^1[34578]\d{9}$/
- ongene database
http://ongene.bioinfo-minzhao.org/index.html
- Qt532_QWebView做成DLL供VC/Delphi使用_Bug
Qt5.3.2 vs2010 OpenGL ,VC6.0,Delphi7 1.自己继承 类QWebView,制作成DLL 供 VC6/Delphi7 使用 2.测试下来,DLL供VC6使用: 加载&q ...