1009. Mersenne Composite N
sicily
prime
题意
给一个数k,对小于k的素数,若2^k -1 的值是合数的话,求出它的质因子
code
直接看源码
#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <map>
using namespace std;
const int M = 64;
bool is_primes[M + 1];
std::vector<int> primes;
void getPrimes() {
for(int i = 0; i < M + 1; i++) {
is_primes[i] = true;
};
is_primes[0] = false;
is_primes[1] = false;
// is_primes[2] = true;
// is_primes[3] = true;
for(int i = 2; i < M + 1; i++){
if(is_primes[i]) {
for(int j = i * 2; j < M + 1; j += i) {
is_primes[j] = false;
}
}
}
for(int i = 0; i < M + 1; i++) {
if(is_primes[i]) {
primes.push_back(i);
// std::cout << i << " ";
}
}
// std::cout << std::endl;
}
void factor(int prime, std::vector<long long>& pf) {
// note here base variable must be long long type
long long base = 1;
long long mersenne = (base << prime) - 1;
// start from 3
// since mersenne can not divide 2, so we can take the evem number into account
long long i;
for(i = 3; i * i <= mersenne; i += 2) {
while(mersenne % i == 0) {
mersenne /= i;
pf.push_back(i);
}
}
- // here don't forget to push back the mersenne
if(mersenne > 1) {
pf.push_back(mersenne);
}
}
void printInfo(const std::vector<long long>& pf, long long mersenne, int prime) {
int size = pf.size();
for(int i = 0; i < size - 1; i++) {
std::cout << pf[i] << " * ";
}
std::cout << pf[size - 1] << " = ";
std::cout << mersenne << " = ( 2 ^ " << prime << " ) - 1";
std::cout << std::endl;
}
void getMersennes(const int minK) {
int size = primes.size();
// ignore 61, but why?
// a tip: since wo can test 61, and it takes a long time to compute and has no result,
// which results in 'Time Limit Exceeded'.
// so here we remove it
for(int i = 0; i < size - 1 && primes[i] <= minK; i++) {
std::vector<long long> pf;
int prime = primes[i];
// factor
factor(prime, pf);
// print info
if(pf.size() > 1) {
// note here base variable must be long long type
long long base = 1;
long long mersenne = (base << prime) - 1;
printInfo(pf, mersenne, prime);
}
pf.clear();
}
}
int main() {
int k;
cin >> k;
//
getPrimes();
//
getMersennes(k);
primes.clear();
return 0;
}