(博弈)(思维)(试除法判断质数)B - 是我仅会的GCD还是素数筛呢? G. Goodbye

简介: (博弈)(思维)(试除法判断质数)B - 是我仅会的GCD还是素数筛呢? G. Goodbye

题目链接

B - 是我仅会的GCD还是素数筛呢?

Problem - G - Codeforces


一些话

cf上一直报ce和re,原因是cf上的clang++有问题,以后都用g++来交

流程

博弈题,通过列举样例来寻找规律


通过列举样例可知有三种情况


1.由两个质数相乘得到的数的结果是-1,


2.质数结果为0


3.其他情况结果是最大的两个质因数乘积


最大质因数和质数的获取比较简单,所以只要用一个数组储存数字对应的结果,初始化为-1,然后判断是否符合2和3的情况,符合的话就做处理


通过试除法来实现上面的流程


枚举可能的因数,判断是否能整除,不能整除的话结果就是0,能整除的话再判断因子对应结果是否是-1(即两个质数的乘积)如果是的话就取自身结果和这个因子的最大值作为最大的质因数乘积


套路

试除法,用于判断质数

 bool flag = false;
         for(int j = 2;j <= i/j;j++){
                if(i % j == 0) {
                        flag = false;
                }
        flag = true;
        }
}

ac代码

#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int f[N];
void init(){
  f[1] = 0;
  for(int i = 2;i <= N;i++){
    f[i] = -1;
    bool flag = false;
    for(int j = 2;j <= i / j;j++){
      if(i % j == 0){
        flag = true;
        if(f[j] == -1) f[i] = max(f[i],j);
        if(f[i/j] == -1) f[i] = max(f[i],i/j);
      }
    }
    if(!flag) f[i] = 0;
  }
}
int main(){
  init();
  int t;    int x;
  cin >> t;
  while(t--){
    scanf("%d",&x);
    cout << f[x] << endl;
  }
  return 0;
}
目录
相关文章
|
6月前
|
机器学习/深度学习 人工智能 算法
【算法基础】分解质因数
【算法基础】分解质因数
48 0
|
4月前
|
算法 C++
试除法求约数:深入分析与实践
试除法求约数:深入分析与实践
22 3
|
4月前
试除法判定质数:深入探索与代码分析
试除法判定质数:深入探索与代码分析
21 0
|
4月前
|
人工智能
试除法判定质数
试除法判定质数
19 0
|
10月前
|
算法 C语言
【C语言】判断一个数是否为素数(素数求解的N种境界)(下)
【C语言】判断一个数是否为素数(素数求解的N种境界)(下)
72 0
|
6月前
|
算法 搜索推荐 程序员
C语言第十三练——输入一个正整数,判断这个数是否是素数
C语言第十三练——输入一个正整数,判断这个数是否是素数
88 0
|
8月前
P4057 [Code+#1]晨跑(数学分析,辗转相除法模板(欧几里得算法))
P4057 [Code+#1]晨跑(数学分析,辗转相除法模板(欧几里得算法))
23 0
|
10月前
|
测试技术 C语言
【C语言】判断一个数是否为素数(素数求解的N种境界)(上)
【C语言】判断一个数是否为素数(素数求解的N种境界)
69 0
|
10月前
|
机器学习/深度学习 C语言
C语言:给定两个数,求这两个数的最大公约数(新思路:辗转相除法)
思路一:普通方法 总体思路: (一). 生成相关变量; 从键盘输入两个数;
C语言:给定两个数,求这两个数的最大公约数(新思路:辗转相除法)
|
10月前
AcWing 866. 试除法判定质数
AcWing 866. 试除法判定质数