[关闭]
@zimenglan 2014-11-02T10:20:04.000000Z 字数 1670 阅读 1286

1009. Mersenne Composite N

sicily prime


题意

原题链接

给一个数k,对小于k的素数,若2^k -1 的值是合数的话,求出它的质因子


code

直接看源码

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <string>
  5. #include <map>
  6. using namespace std;
  7. const int M = 64;
  8. bool is_primes[M + 1];
  9. std::vector<int> primes;
  10. void getPrimes() {
  11. for(int i = 0; i < M + 1; i++) {
  12. is_primes[i] = true;
  13. };
  14. is_primes[0] = false;
  15. is_primes[1] = false;
  16. // is_primes[2] = true;
  17. // is_primes[3] = true;
  18. for(int i = 2; i < M + 1; i++){
  19. if(is_primes[i]) {
  20. for(int j = i * 2; j < M + 1; j += i) {
  21. is_primes[j] = false;
  22. }
  23. }
  24. }
  25. for(int i = 0; i < M + 1; i++) {
  26. if(is_primes[i]) {
  27. primes.push_back(i);
  28. // std::cout << i << " ";
  29. }
  30. }
  31. // std::cout << std::endl;
  32. }
  33. void factor(int prime, std::vector<long long>& pf) {
  34. // note here base variabel must be long long type
  35. long long base = 1;
  36. long long mersenne = (base << prime) - 1;
  37. // start from 3
  38. // since mersenne can not divide 2, so we can take the evem number into account
  39. long long i;
  40. for(i = 3; i * i <= mersenne; i += 2) {
  41. while(mersenne % i == 0) {
  42. mersenne /= i;
  43. pf.push_back(i);
  44. }
  45. }
  46. if(mersenne > 1) {
  47. pf.push_back(mersenne);
  48. }
  49. }
  50. void printInfo(const std::vector<long long>& pf, long long mersenne, int prime) {
  51. int size = pf.size();
  52. for(int i = 0; i < size - 1; i++) {
  53. std::cout << pf[i] << " * ";
  54. }
  55. std::cout << pf[size - 1] << " = ";
  56. std::cout << mersenne << " = ( 2 ^ " << prime << " ) - 1";
  57. std::cout << std::endl;
  58. }
  59. void getMersennes(const int minK) {
  60. int size = primes.size();
  61. // ignore 61, but why?
  62. // a tip: since wo can test 61, and it takes a long time to compute and has no result,
  63. // which results in 'Time Limit Exceeded'.
  64. // so here we remove it
  65. for(int i = 0; i < size - 1 && primes[i] <= minK; i++) {
  66. std::vector<long long> pf;
  67. int prime = primes[i];
  68. // factor
  69. factor(prime, pf);
  70. // print info
  71. if(pf.size() > 1) {
  72. // note here base variabel must be long long type
  73. long long base = 1;
  74. long long mersenne = (base << prime) - 1;
  75. printInfo(pf, mersenne, prime);
  76. }
  77. pf.clear();
  78. }
  79. }
  80. int main() {
  81. int k;
  82. cin >> k;
  83. //
  84. getPrimes();
  85. //
  86. getMersennes(k);
  87. primes.clear();
  88. return 0;
  89. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注