D. Buying Shovels(暴力,小技巧)

D. Buying Shovels

问题:给出a,b,问在区间[1, b],找到一个a的最大的因子n,使a/n最小。

思路:暴力!!!
因为数据范围,就根本没敢往上面想。
因为因子总是成对出现,一个大于 n \sqrt n n ,一个小于 n \sqrt n n ,这样一来我们就可以只枚举到 n \sqrt n n 就足够了。

代码

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main() {
    
    
	ll t, a, b, mi, idx;
	scanf("%lld", &t);
	while(t--) {
    
    
		mi = 0, idx = 0;
		scanf("%lld%lld", &a, &b);
		if(a <= b) printf("1\n"); //如果b大与a,最大因子就是a了。
		else {
    
    
			for(ll i=1; i<sqrt(a)+1; i++) {
    
    
				if(a % i == 0) {
    
    //找到一个最大的因子。
					if(a/i <= b)	mi = max(mi, a/i);
					if(i <= b) 		mi = max(mi, i);
				}
			}
			printf("%lld\n", a/mi);//求答案。
		}
	}
	return 0;
}

找一个数x的因子不用枚举到x,只需要到 x \sqrt x x 就行了。

猜你喜欢

转载自blog.csdn.net/weixin_45363113/article/details/106844874