CCF-CSP认证 2023年12月 2.因子化简
题解:
通过质数筛法,用个板子函数就行了,计算出质数系数就行了
#pragma GCC optimize(2, 3, "Ofast", "inline")
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
long long int num;
const int MAXN = 10000;
int prime[MAXN + 1];
void getPrime()
{memset(prime, 0, sizeof(prime));for (int i = 2; i <= MAXN; i++){if (!prime[i])prime[++prime[0]] = i;for (int j = 1; j <= prime[0] && prime[j] <= MAXN / i; j++){prime[prime[j] * i] = 1;if (i % prime[j] == 0)break;}}
}
//factors[i][0]表示大数的第i个质因子是什么
//factors[i][1]表示大数的第i个质因子的系数是多少
long long factor[100][2];
//不同质因子的个数
int fatCnt;
int getFactors(long long x)
{fatCnt = 0;long long tmp = x;for (int i = 1; prime[i] <= tmp / prime[i]; i++){factor[fatCnt][1] = 0;if (tmp % prime[i] == 0){factor[fatCnt][0] = prime[i];while (tmp % prime[i] == 0){factor[fatCnt][1]++;tmp /= prime[i];}fatCnt++;}}if (tmp != 1){factor[fatCnt][0] = tmp;factor[fatCnt++][1] = 1;}return fatCnt;
}
void work()
{getPrime();int q;cin >> q;int k;while (q--){cin >> num >> k;// cout << getFactors(num) << endl;int yinzi_nums=getFactors(num);for (int i = 0; i < yinzi_nums; i++){if(factor[i][1]<k){num/=pow(factor[i][0],factor[i][1]);}}cout<<num<<endl;}
}
int main()
{ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);work();return 0;
}