题目链接:QAQ
题意:求大于2的最大次方等于x
思路:求各质因子个数的最大公因子(注意负数要进行额外操作,负数被卡了好久)
附上代码:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
const int MAXN = 1000000;
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;
}
}
}
long long factor[100][2];
int fatCnt;
void getFactors(long long x) {
fatCnt = 0;
long long tot = 0;
long long tmp = x;
for (int i = 1; prime[i] <= tmp / prime[i]; i++) {
factor[fatCnt][1] = 0;
tot = 0;
if (tmp%prime[i] == 0) {
factor[fatCnt][0] = prime[i];
while (tmp%prime[i] == 0) {
factor[fatCnt][1]++;
tmp /= prime[i];
tot++;
}
fatCnt++;
}
}
if (tmp != 1) {
factor[fatCnt][0] = tmp;
factor[fatCnt++][1] = 1;
}
}
long long gcd(long long a, long long b) {
long long t;
while (b) {
t = b;
b = a%b;
a = t;
}
return a;
}
int main(void) {
int t;
getPrime();
scanf("%d", &t);
int ttt = 1;
while (t--) {
long long n;
scanf("%lld", &n);
int fla = 0;
if (n < 0) {
fla = 1;
n = -n;
}
printf("Case %d: ", ttt++);
if (n == 1) {
printf("1\n");
continue;
}
getFactors(n);
long long zz = factor[0][1];
for (int i = 1; i < fatCnt; i++) {
zz = gcd(zz, factor[i][1]);
}
if (fla == 1) {
while (zz % 2 == 0) {
zz /= 2;
}
}
printf("%lld\n", zz);
}
return 0;
}