Description
BD最近沉迷于数论,她最近在研究最小公倍数和最大公约数,她的老师Z给她留了一个作业:在[x,y]区间中,求两个整数最大公约数是x且最小公倍数是y的个数。
Input
第一行输入一个T(T<=300),表示有T组数据,接下来输入两个数 x, y(1<=x<=y<=1e6)(含义如题)
Output
输出一行表示答案
Accepted Code
#include <bits/stdc++.h> using namespace std; long long gcd(long long x, long long y) { if (x < y) { swap(x, y); } long long rem; while (y > 0) { rem = x % y; x = y; y = rem; } return x; } //x*y==a*b必要 int main() { std::ios::sync_with_stdio(false); int t; while (cin >> t) { while (t--) { long long x, y, cnt = 0; cin >> x >> y; long long h = x * y; for (long long a = x; a <= y; a++) //a从区间左端开始向右遍历 { if (h % a == 0) { if (h / a >= x && h / a <= y && gcd(a, h / a) == x) // h/a的大小判断条件不可缺少 { cnt++; } } } cout << cnt << endl; } } return 0; }
解后反思
在这个题目上浪费了较多时间,主要原因是一开始想的是双因素遍历,由a*b=x*y自然容易想到双因素,双重for循环直接导致TLE
其实直接判断一个,另一个也就出来了,通过一些约束条件的限制即可
gcd(a,b)==x 以及x*y/a的值必须要在区间内能够取到