この問題は剰余を問います。
宝石 の個数 とします。
宝石 を 人全員で同じ量ずつ配ることができるのは となるときです。なお は を で割ったあまりを表します。
のとき、 人全員で同じ量ずつ分け合うために必要な宝石 の個数 は 個です。これが正しいことは、あまりの性質を用いて示すことができます。一方 のとき、明らかに 人で配り切れるので、 とするのが適切です。
また答えが equality
となる条件は、すべての に対し が成り立つことであることも明らかです。
以上からこの問題は で解くことが可能です。以下、解答例(C++,Python)です。
xxxxxxxxxx
//[0,n)
//[a,b)
using namespace std;
using ll = long long;
using ull = unsigned long long;
using P = pair<ll,ll>;
using pq = priority_queue<P,vector<P>,greater<P>>;
ll inf = 8e18;
int iinf = (int)1e9;
int mod9 = 998244353;
int mod1 = 1000000007;
struct Edge { int to; int cost; int from; };
bool compe(const Edge &e,const Edge &e2){ return e.cost < e2.cost; }
using Graph = vector<Edge>;
using SGraph = vector<set<ll>>;
template <typename T>
int siz(T& a){return (int)a.size();}
int main(void){
int n,m,s; cin >> n >> m >> s;
vector<int> J(m,0),E(m,0);
rep(i,n){
int l; cin >> l;
rep(j,l){
int a; cin >> a;
J[a-1]++;
}
}
bool z = 1;
rep(i,m){
E[i] = (J[i]%s == 0 ? 0 : s-J[i]%s);
if(E[i] > 0) z = 0;
}
if(z) cout << "equality";
else rep(i,m) cout << E[i] << (i == m-1 ? "\n" : " ");
}
xxxxxxxxxx
n,m,s = map(int,input().split())
J = [0 for i in range(m)]
ans = 0
for i in range(n):
d = list(map(int,input().split()))
L = d[0]
for j in range(L):
J[d[j+1]-1] += 1
z = 1
E = [0 for i in range(m)]
for i in range(m):
if J[i]%s != 0:
z = 0
if J[i]%s == 0:
E[i] = 0
else:
E[i] = s-(J[i]%s)
if z:
print("equality")
else:
print(*E)