Advertisement
MinhNGUYEN2k4

Untitled

Feb 24th, 2022
744
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.94 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. #define double long double
  4. #define Task "E"
  5. #define READFILE freopen(Task".inp", "r", stdin)
  6. #define WRITEFILE freopen(Task".out", "w", stdout)
  7. #define double long double
  8. #define oo 1e18
  9. #define FAST ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
  10. #define mp make_pair
  11. #define pb push_back
  12. #define X first
  13. #define Y second
  14. #define watch(x) cout << (#x) << " = " << x << endl
  15. #define debug(x) cout << (#x) << " = " << x << endl
  16. #define all(x) x.begin(), x.end()
  17. #define sz(x) x.size()
  18. #define endl '\n'
  19. #define max3(a,b,c) max(max(a, b), c)
  20. #define max4(a,b,c,d) max(max(a, b), max(c, d))
  21. #define min4(a,b,c,d) min(min(a, b), min(c, d))
  22. #define debug4(a,b,c,d) watch(a);watch(b);watch(c);watch(d)
  23. #define ever (;true;)
  24. #define maxn 505
  25.  
  26. #define PI 3.14159265
  27.  
  28. using namespace std;
  29.  
  30. typedef pair < int, int > ii;
  31. typedef pair < int, ii > iii;
  32. typedef pair < ii, ii > iiii;
  33. typedef vector < int > vi;
  34. typedef vector < ii > vii;
  35. typedef vector < vi > vvi;
  36. typedef vector < iii > viii;
  37. typedef vector < vii > vvii;
  38. typedef vector < iiii > viiii;
  39. typedef vector < vvi > vvvi;
  40.  
  41. const int N = 1e5 + 5;
  42.  
  43. struct HashSet{
  44.     int base1, mod1, base2, mod2;
  45.  
  46.     int Power1[N], Power2[N];
  47.  
  48.     HashSet(int b1 = 1, int m1 = 1, int b2 = 1, int m2 = 1){
  49.         base1 = b1;
  50.         mod1 = m1;
  51.         base2 = b2;
  52.         mod2 = m2;
  53.         Power1[0] = Power2[0] = 1;
  54.         for (int i = 1; i <= 100000; ++i){
  55.             Power1[i] = Power1[i-1]*base1%mod1;
  56.             Power2[i] = Power2[i-1]*base2%mod2;
  57.         }
  58.     }
  59.  
  60.     ii GetHash(int arr[], int arrsize = 0){
  61.         ii Hash = ii(0, 0);
  62.         for (int i = 0; i < arrsize; ++i){
  63.             Hash.X += Power1[arr[i]];
  64.             if (Hash.X >= mod1) Hash.X %= mod1;
  65.             Hash.Y += Power2[arr[i]];
  66.             if (Hash.Y >= mod2) Hash.Y %= mod2;
  67.         }
  68.         return Hash;
  69.     }
  70.  
  71.  
  72. }HS(115079, 1000004249, 763787, 1000004459);
  73.  
  74. int n;
  75. int a[N];
  76.  
  77. viii res;
  78.  
  79. void init(){
  80.     FAST;
  81.     if (fopen(Task".inp", "r")){
  82.         READFILE;
  83.         WRITEFILE;
  84.     }
  85.     cin >> n;
  86.     for (int i = 1; i <= n; ++i) cin >> a[i];
  87. }
  88.  
  89. map < ii, int > Map;
  90.  
  91. void Process(int len){
  92.     if (len < 1 || len >= n) return;
  93.     if (n % len) return;
  94.     Map.clear();
  95.     for (int i = 1; i <= n; i += len){
  96.         ii cur = HS.GetHash(a + i, len);
  97.         Map[cur]++;
  98.     }
  99.     if (Map.size() == 2){
  100.         vi p;
  101.         for (auto T : Map) p.pb(T.Y);
  102.         sort(all(p), greater < int > ());
  103.         res.pb(iii(len, ii(p[0], p[1])));
  104.     }
  105. }
  106.  
  107. signed main(){
  108.     init();
  109.     for (int i = 1; i * i <= n; ++i){
  110.         if (n % i == 0){
  111.             Process(i);
  112.             if (i * i != n) Process(n / i);
  113.         }
  114.     }
  115.     sort(all(res));
  116.     cout << ((int)res.size() == 0 ? -1 : (int)res.size()) << endl;
  117.     for (iii T : res) cout << T.X << ' ' << T.Y.X << ' ' << T.Y.Y << endl;
  118.     return 0;
  119. }
  120.  
  121.  
  122.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement