3 条题解
-
5
提供一种类似二分的做法
脑子一抽想出来的,也不知道算不算二分
-
了解性质
两数之积为这两数的最小公倍数最大公约数之积
即xy=gcd(x,y)*lcm(x,y)(gcd为x,y的最大公约数,lcm为x,y的最小公倍数)
-
确定思路
- 题目给出了一个 l~r 的区间,我们可以通过这个区间单调性来做二分(不知道算不算)
- 指针 l 指向开头,r 指向结尾,l 和 r 表示可能的答案,即题目中的P、Q 计算 l 和 r 的乘积,判断两数之积是否为这两数的最小公倍数和最大公约数之积:
- 等于, 判断 gcd( l , r ) 是否为 x , lcm( l , r ) 是否为 y, 是的话 ans++, 不要忘记无论是否,都要移动两指针
- 当l*r>gcd( l,r )*lcm( l,r ),说明积大了,r--;
- 当l*r<gcd( l,r )*lcm( l,r ),说明积小了,l++;
- 直到指针相交结束
-
部分AC Code
ll x,y,ans; ll gcd(ll x,ll y){ if(y==0) return x; return gcd(y,x%y); } ll lcm(ll x,ll y){ return x/gcd(x,y)*y; } int mian(){ ios::sync_with_stdio(false); cin.tie(0),cout.tie(0); cin>>x>>y; ll l=x,r=y,j=x*y; while(l<=r){ int m=l*r; if(m>j) r--; //积大,将数减小 else if(m<j) l++; //积小,将数增大 else{ if(gcd(l,r)==x && lcm(l,r)==y) ans++; l++,r--; } } cout<<ans*2; //因子成对出现 return 0; }
-
-
-1
#include<bits/stdc++.h> using namespace std; long long a,b,c,d,s; int i=0; long long gcd(long long x,long long y){ if(y==0)return x; return gcd(y,x%y); } long long lcm(long long x,long long y){ return x/gcd(x,y)*y; } int main(){ cin>>a>>b; for(int i=a;i<=b;i+=a){ if(gcd(i,a*b/i)==a&&lcm(i,a*b/i)==b)s++; } cout<<s; return 0; }
- 1
信息
- ID
- 540
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- (无)
- 递交数
- 189
- 已通过
- 91
- 上传者