Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define int long long
- #define double long double
- #define Task "E"
- #define READFILE freopen(Task".inp", "r", stdin)
- #define WRITEFILE freopen(Task".out", "w", stdout)
- #define double long double
- #define oo 1e18
- #define FAST ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL)
- #define mp make_pair
- #define pb push_back
- #define X first
- #define Y second
- #define watch(x) cout << (#x) << " = " << x << endl
- #define debug(x) cout << (#x) << " = " << x << endl
- #define all(x) x.begin(), x.end()
- #define sz(x) x.size()
- #define endl '\n'
- #define max3(a,b,c) max(max(a, b), c)
- #define max4(a,b,c,d) max(max(a, b), max(c, d))
- #define min4(a,b,c,d) min(min(a, b), min(c, d))
- #define debug4(a,b,c,d) watch(a);watch(b);watch(c);watch(d)
- #define ever (;true;)
- #define maxn 505
- #define PI 3.14159265
- using namespace std;
- typedef pair < int, int > ii;
- typedef pair < int, ii > iii;
- typedef pair < ii, ii > iiii;
- typedef vector < int > vi;
- typedef vector < ii > vii;
- typedef vector < vi > vvi;
- typedef vector < iii > viii;
- typedef vector < vii > vvii;
- typedef vector < iiii > viiii;
- typedef vector < vvi > vvvi;
- const int N = 1e5 + 5;
- struct HashSet{
- int base1, mod1, base2, mod2;
- int Power1[N], Power2[N];
- HashSet(int b1 = 1, int m1 = 1, int b2 = 1, int m2 = 1){
- base1 = b1;
- mod1 = m1;
- base2 = b2;
- mod2 = m2;
- Power1[0] = Power2[0] = 1;
- for (int i = 1; i <= 100000; ++i){
- Power1[i] = Power1[i-1]*base1%mod1;
- Power2[i] = Power2[i-1]*base2%mod2;
- }
- }
- ii GetHash(int arr[], int arrsize = 0){
- ii Hash = ii(0, 0);
- for (int i = 0; i < arrsize; ++i){
- Hash.X += Power1[arr[i]];
- if (Hash.X >= mod1) Hash.X %= mod1;
- Hash.Y += Power2[arr[i]];
- if (Hash.Y >= mod2) Hash.Y %= mod2;
- }
- return Hash;
- }
- }HS(115079, 1000004249, 763787, 1000004459);
- int n;
- int a[N];
- viii res;
- void init(){
- FAST;
- if (fopen(Task".inp", "r")){
- READFILE;
- WRITEFILE;
- }
- cin >> n;
- for (int i = 1; i <= n; ++i) cin >> a[i];
- }
- map < ii, int > Map;
- void Process(int len){
- if (len < 1 || len >= n) return;
- if (n % len) return;
- Map.clear();
- for (int i = 1; i <= n; i += len){
- ii cur = HS.GetHash(a + i, len);
- Map[cur]++;
- }
- if (Map.size() == 2){
- vi p;
- for (auto T : Map) p.pb(T.Y);
- sort(all(p), greater < int > ());
- res.pb(iii(len, ii(p[0], p[1])));
- }
- }
- signed main(){
- init();
- for (int i = 1; i * i <= n; ++i){
- if (n % i == 0){
- Process(i);
- if (i * i != n) Process(n / i);
- }
- }
- sort(all(res));
- cout << ((int)res.size() == 0 ? -1 : (int)res.size()) << endl;
- for (iii T : res) cout << T.X << ' ' << T.Y.X << ' ' << T.Y.Y << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement