Codeforces Round #696 (Div. 2) B. Different Divisors

B Different Divisors

题目链接https://codeforces.com/contest/1474/problem/B

题意:

计算出一个值a,使得a至少存在4个因子,且任意两个因子之间的差值大于等于给定的整数b,且a是在满足这个条件下的最小值。

思路:

先看示例
当b为1时,a的最小值为6(6的因子为:1,2,3,6);
当b为2时,a的最小值为15(15的因子为:1,3,5,15);

哦吼吼你是不是想到了a = (b + 1)* (b + b + 1);但是你试试b = 3?是不是就变成4 * 7 = 28,因子就变成了1,2,4,7,28了,就不满足任意两个因子的差值至少为b了。

再想以下,除了1以外,任意一个数都有两个因子:1和本身,那要找至少有四个因子的数的最小值,就找刚刚好只有四个因子的肯定比多于四个的要优,所以上面就用的是两个数相乘,那么我们只需要找到这两个数就行了。而上式出现的问题就是,b + 1或者b + b + 1可能是合数,导致求出的a的因字数大于4个且,由于多出的因子是本有的因子的因子,所以导致了任意两个因子之间不满足差值最小为b(因为本来b + 1就是踩线擦边球了,b + 1 再变成 b + 1 = c * d(c,d都不为1)的话,那abs(c - d) 肯定就小于b了呀)。所以就容易推出剩余的两个因子是素数(观察样例也发现是的),找出最小的,且>= b + 1的素数,就是二个因数,那第三个因数是不是就是>= b + b + 1的最小素数呢?不一定哦,万一第二个素数就刚好>= b + b + 1了呀,所以第三个因子应该是大于第二个因子的最小素数。

在本题中,由于b的范围很小,所以直接暴力求素数就可以了。

那么答案就是第二、三个因子的乘积就是了。因为res = 因子 2 * 因子 3,那么res 的因子就又四个,分别为1,因子 2,因子 3,res。

AC代码

#include <bits/stdc++.h>
 
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 100;
int le[maxn];
 
bool isPrime(int a){
    for(int i = 2; i <= sqrt(a); i ++){
        if(a % i == 0) return false;
    }
    return true;
}
 
int main(){
    ios::sync_with_stdio(0);
    cin.tie(); cout.tie(0);
 
    int t; cin >> t;
    while(t--){
        int d; cin >> d;
        int a = 1 + d, b = 1 + 2 * d;
        while(!isPrime(a)) a ++;
        b = a + d;
        while(!isPrime(b)) b ++;
        cout << 1ll * a * b << "\n";
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值