(博弈)(思维)(试除法判断质数)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;
}
目录
相关文章
|
C语言
C语言之求平方的倒数的和
C语言之求平方的倒数的和
|
7月前
【错题集-编程题】素数回文(模拟 + 数学)
【错题集-编程题】素数回文(模拟 + 数学)
|
算法 C语言
【C语言】判断一个数是否为素数(素数求解的N种境界)(下)
【C语言】判断一个数是否为素数(素数求解的N种境界)(下)
133 0
|
7月前
|
算法 C++
试除法求约数:深入分析与实践
试除法求约数:深入分析与实践
69 3
|
7月前
|
存储 算法 搜索推荐
C语言第二十七练 异或的运算规律
C语言第二十七练 异或的运算规律
64 0
|
算法 C语言 C++
【数论】试除法判断质数,分解质因数,筛质数
将定义进行模拟,若整除了除1与其自身的另外的数,则为质数
141 0
|
测试技术 C语言
【C语言】判断一个数是否为素数(素数求解的N种境界)(上)
【C语言】判断一个数是否为素数(素数求解的N种境界)
277 0
|
算法 C语言
07【C语言 & 趣味算法】最佳存款方案(采用 从后往前 递推解决)
07【C语言 & 趣味算法】最佳存款方案(采用 从后往前 递推解决)
07【C语言 & 趣味算法】最佳存款方案(采用 从后往前 递推解决)
C语言(冒泡排序思想及代码实现)(分别用递归和非递归实现斐波拉系数)(数组)(函数)
C语言(冒泡排序思想及代码实现)(分别用递归和非递归实现斐波拉系数)(数组)(函数)
C语言(冒泡排序思想及代码实现)(分别用递归和非递归实现斐波拉系数)(数组)(函数)