Pagini recente » Cod sursa (job #1025314) | Cod sursa (job #1988892) | Cod sursa (job #3296095) | Cod sursa (job #2249865) | Cod sursa (job #3342626)
#include <bits/stdc++.h>
#define cin ci
#define cout co
#pragma GCC optimize("03,unroll-loops")
using namespace std;
ifstream cin("curcubeu.in");
ofstream cout("curcubeu.out");
int n, a1, b1, c1;
vector<int> a, b, c;
vector<int> par, siz;
int findroot(int node)
{
if(node == par[node])
return node;
return par[node] = findroot(par[node]);
}
void unionset(int node1, int node2)
{
node1 = findroot(node1);
node2 = findroot(node2);
if(node1 == node2)
return;
if(siz[node1] < siz[node2])
swap(node1, node2);
if(siz[node1] == siz[node2])
siz[node1] ++;
par[node2] = node1;
}
int main()
{
cin >> n >> a1 >> b1 >> c1;
a.resize(n + 5);
b.resize(n + 5);
c.resize(n + 5);
par.resize(n + 5);
siz.resize(n + 5);
for(int i = 1; i <= n; i ++)
{
par[i] = i;
siz[i] = 1;
}
a[1] = a1, b[1] = b1, c[1] = c1;
for(int i = 2; i < n; i ++)
{
a[i] = (a[i - 1] * i) % n;
b[i] = (b[i - 1] * i) % n;
c[i] = (c[i - 1] * i) % n;
}
vector<int> ans(n + 5);
for(int i = n - 1; i >= 1; i --)
{
int color = c[i];
int dr = max(b[i], a[i]);
while(dr >= min(a[i], b[i]))
{
dr = findroot(b[i]);
if(dr == b[i])
{
ans[dr] = c[i];
par[b[i]] = b[i] - 1;
}
dr --;
}
}
for(int i = 1; i < n; i ++)
cout << ans[i] << '\n';
return 0;
}