从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 ...
随机推荐
- try...cath...finally中的return什么时候执行
一finally可以没有,也可以只有一个.无论有没有发生异常,它总会在这个异常处理结构的最后运行.即使你在try块内用return返回了,在返回前,finally总是要执行,这以便让你有机会能够在异常 ...
- 2.8 The Object Model -- Enumerables
在Ember.js中,枚举是包含许多子对象的任何对象,并允许你使用Ember.Enumerable API和那些子对象一起工作.在大部分应用程序中最常见的可枚举是本地JS数组,Ember.js扩展到符 ...
- RabittMQ实践(一): RabbitMQ的安装、启动
安装: 启动监控管理器:rabbitmq-plugins enable rabbitmq_management 关闭监控管理器:rabbitmq-plugins disable rabbitmq_ ...
- 470. Implement Rand10() Using Rand7() (拒绝采样Reject Sampling)
1. 问题 已提供一个Rand7()的API可以随机生成1到7的数字,使用Rand7实现Rand10,Rand10可以随机生成1到10的数字. 2. 思路 简单说: (1)通过(Rand N - 1) ...
- windows 系统相关配置
1. 外接显示器分辨率调节:连接上外接下显示器,在本机空白处,右键,分辨率.然后选择显示器,设置显示相关配置. 详见:http://zhidao.baidu.com/question/13494806 ...
- Win10下安装Go开发环境
关于Go语言有多么值得学习,这里就不做介绍了,既然看了这篇文章,想必是对有学习意向. 这里是在Windows下安装Go环境,去中文社区的下载栏目,https://studygolang.com/dl ...
- 一个好玩的CTF题
一个CTF的题目,拿来学习学习 玩了好久,再加上学校一堆破事,最近又开始瞎弄了,找了几个CTF的题目,和别人写的一些内容,也当是学习,也当是看完之后的小结.顺便也说一下如果自己拿到这题目会从哪做起. ...
- openwrt编译系统生成ubi镜像的各变量解析
1.MKUBIFS_OPTS的作用 传递参数给mkfs.ubifs 2.MKUBIFS_OPTS传递了哪些参数? 传递了最小输入输出单元大小.逻辑擦除块大小.最大物理擦除块的个数,分别由选项-m.-e ...
- UVA 11019 Matrix Matcher(二维hash + 尺取)题解
题意:在n*m方格中找有几个x*y矩阵. 思路:二维hash,总体思路和一维差不太多,先把每行hash,变成一维的数组,再对这个一维数组hash变成二维hash.之前还在想怎么快速把一个矩阵的hash ...
- System.Data.SQLite未能加载文件或程序集
1.简直是作死帝呀.不需要修改dll的名字,否则就坐等悲剧吧 如果项目中有x86和x64的dll,可以建两个不同的文件夹分别存放,但是千万不要修改掉默认的dll的名字 System.Data.SQLi ...