1009. Mersenne Composite N

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 variable 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. // here don't forget to push back the mersenne
  47. if(mersenne > 1) {
  48. pf.push_back(mersenne);
  49. }
  50. }
  51. void printInfo(const std::vector<long long>& pf, long long mersenne, int prime) {
  52. int size = pf.size();
  53. for(int i = 0; i < size - 1; i++) {
  54. std::cout << pf[i] << " * ";
  55. }
  56. std::cout << pf[size - 1] << " = ";
  57. std::cout << mersenne << " = ( 2 ^ " << prime << " ) - 1";
  58. std::cout << std::endl;
  59. }
  60. void getMersennes(const int minK) {
  61. int size = primes.size();
  62. // ignore 61, but why?
  63. // a tip: since wo can test 61, and it takes a long time to compute and has no result,
  64. // which results in 'Time Limit Exceeded'.
  65. // so here we remove it
  66. for(int i = 0; i < size - 1 && primes[i] <= minK; i++) {
  67. std::vector<long long> pf;
  68. int prime = primes[i];
  69. // factor
  70. factor(prime, pf);
  71. // print info
  72. if(pf.size() > 1) {
  73. // note here base variable must be long long type
  74. long long base = 1;
  75. long long mersenne = (base << prime) - 1;
  76. printInfo(pf, mersenne, prime);
  77. }
  78. pf.clear();
  79. }
  80. }
  81. int main() {
  82. int k;
  83. cin >> k;
  84. //
  85. getPrimes();
  86. //
  87. getMersennes(k);
  88. primes.clear();
  89. return 0;
  90. }
Mersenne Twister(梅森旋转算法)是一种广泛使用的伪随机数生成算法,它具有良好的随机性和周期性特性。下面详细说明Mersenne Twister算法的工作原理: 1. **初始化种子**: Mersenne Twister算法需要一个种子值来开始生成随机数序列。种子值可以是任意整数,通常使用当前时间戳作为种子。 2. **初始化状态**: 初始种子值通过一个称为“初始化状态”的过程,将其转换为一个内部状态数组。这个数组通常有 624 个元素,并且可以存储 32 位整数。 3. **填充状态数组**: 初始状态数组只是种子值的简单转换,接下来需要通过填充状态数组来生成更多的随机数。填充状态数组的过程是使用一个称为“梅森旋转”的操作,将当前状态数组中的元素与一些位运算和异或操作相结合,得到新的状态值。 4. **生成随机数**: 填充状态数组后,可以从状态数组中提取随机数。通常情况下,每次需要一个随机数时,会从状态数组中选择一个元素作为输出,并对其进行一系列的变换操作,以产生最终的随机数。 5. **重复填充和生成过程**: 当需要更多随机数时,将重复填充状态数组和生成随机数的过程。每次填充状态数组都会更新状态数组中的元素,从而保持随机性。 Mersenne Twister算法的关键之处在于其内部状态数组的维护和梅森旋转操作的使用。这些操作保证了生成的随机数序列具有良好的随机性和周期性特性。 在Python中,Mersenne Twister算法是random模块的默认随机数生成器。可以使用`random`模块中的各种函数和方法来生成随机数。例如: ```python import random random_number = random.random() # 生成0到1之间的随机浮点数 print(random_number) ``` 除了`random()`函数之外,`random`模块还提供了其他一些生成随机数的函数,如`randint()`(生成指定范围内的整数)、`uniform()`(生成指定范围内的随机浮点数)等。 总结来说,Mersenne Twister算法是一种常用的伪随机数生成算法,它通过内部状态数组和梅森旋转操作来生成高质量的随机数。在Python中,可以使用random模块来方便地调用这个算法生成各种类型的随机数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值