题目链接
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; }