4 条题解
-
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; } -
-
0
#include<bits/stdc++.h>
-
-
- [ ] #define ll long long
``#define un unsigned #define int long long #define db double #define st string #define ct const #define xh(a,b,c) for(int a=b;a<=c;a++) #define wx() while(1) #define dn(a,b,c) for(int a=b;a>=c;a--) using namespace std; un ll t; ll n,k; ll ans; vector<int> a; vector<int> b; int gcd(int x,int y){ return y?gcd(y,x%y):x; } int lcm(int x,int y){ return xy/gcd(x,y); } signed main(){ cin>>n>>k; t=nk; for(int i=1;i*i<=t;i++)if(t%i0)a.push_back(i),b.push_back(t/i); for(int i=0;i<a.size();i++){ int t1=lcm(a[i],b[i]),t2=gcd(a[i],b[i]); if(t2n&&t1==k)ans+=2; } cout<<ans; return 0; }
- [ ] #define ll long long
-
-
-
-2
#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
- 标签
- (无)
- 递交数
- 190
- 已通过
- 92
- 上传者