@zimenglan
2014-11-02T10:20:04.000000Z
字数 1670
阅读 1432
sicily prime
给一个数k,对小于k的素数,若2^k -1 的值是合数的话,求出它的质因子
直接看源码
#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 variabel must be long long typelong 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 accountlong long i;for(i = 3; i * i <= mersenne; i += 2) {while(mersenne % i == 0) {mersenne /= i;pf.push_back(i);}}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 itfor(int i = 0; i < size - 1 && primes[i] <= minK; i++) {std::vector<long long> pf;int prime = primes[i];// factorfactor(prime, pf);// print infoif(pf.size() > 1) {// note here base variabel must be long long typelong 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;}