562b384167350ac93b00010c.h 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. #pragma once
  2. #include <algorithm>
  3. #include <numeric>
  4. #include <vector>
  5. #include <set>
  6. class WeirdPrimeGen
  7. {
  8. public:
  9. static long long countOnes( long long n );
  10. static long long maxPn( long long n );
  11. static int anOverAverage( long long n ) {
  12. return 3;
  13. }
  14. static std::vector<long long> anOver( long long n );
  15. static void moar( std::vector<long long> & a, std::vector<long long> & p );
  16. };
  17. void WeirdPrimeGen::moar( std::vector<long long> & a, std::vector<long long> & p ) {
  18. a.push_back( a.back() + std::gcd( a.back(), a.size() + 1 ) );
  19. p.push_back( a.back() - a.at( a.size() - 2 ) );
  20. }
  21. long long WeirdPrimeGen::countOnes( long long n )
  22. {
  23. std::vector<long long> a{7};
  24. std::vector<long long> g{1};
  25. while( a.size() < n ) {
  26. moar( a, g );
  27. }
  28. return std::count( g.begin(), g.end(), 1 );
  29. }
  30. long long WeirdPrimeGen::maxPn( long long n )
  31. {
  32. std::vector<long long> a{7};
  33. std::vector<long long> g{1};
  34. std::set<long long> result;
  35. result.insert( 1 );
  36. while( result.size() < n + 1 ) {
  37. moar( a, g );
  38. result.insert( g.back() );
  39. }
  40. return *result.rbegin();
  41. }
  42. std::vector<long long> WeirdPrimeGen::anOver( long long n )
  43. {
  44. std::vector<long long> a{7};
  45. std::vector<long long> g{1};
  46. std::vector<long long> result;
  47. while( result.size() < n ) {
  48. moar( a, g );
  49. if( g.back() != 1 ) {
  50. result.push_back( a.back() / a.size() );
  51. }
  52. }
  53. return result;
  54. }