update
This commit is contained in:
parent
1c0c534c5a
commit
8c18daa10a
96
src/P7113/P7113.cpp
Normal file
96
src/P7113/P7113.cpp
Normal file
@ -0,0 +1,96 @@
|
||||
#include <bits/stdc++.h>
|
||||
using namespace std;
|
||||
using ll = int64_t;
|
||||
using i128 = __int128;
|
||||
|
||||
const ll maxn{ll(1e5+5)};
|
||||
ll n,m,ind[maxn];
|
||||
pair<i128,i128> nds[maxn];
|
||||
vector<ll> adj[maxn];
|
||||
|
||||
i128 gcd128(i128 m,i128 n){
|
||||
while(n!=0){
|
||||
i128 t{m%n};
|
||||
m=n;
|
||||
n=t;
|
||||
}
|
||||
return m;
|
||||
}
|
||||
|
||||
void sf(i128 &p,i128 &q){
|
||||
i128 gcda{gcd128(p,q)};
|
||||
p/=gcda;
|
||||
q/=gcda;
|
||||
}
|
||||
|
||||
pair<i128,i128> add(i128 p1,i128 q1,i128 p2,i128 q2){
|
||||
i128 pa,qa;
|
||||
i128 lcm{q1*q2/gcd128(q1,q2)};
|
||||
qa=lcm;
|
||||
p1=p1*(lcm/q1);
|
||||
p2=p2*(lcm/q2);
|
||||
pa=p1+p2;
|
||||
sf(pa,qa);
|
||||
return {pa,qa};
|
||||
}
|
||||
|
||||
ostream &operator<<(ostream &os, i128 num){
|
||||
if(num < 0){
|
||||
os << '-';
|
||||
num = -num;
|
||||
}
|
||||
string s;
|
||||
if(num == 0){
|
||||
s = "0";
|
||||
}
|
||||
while(num > 0){
|
||||
s += '0' + (num % 10);
|
||||
num /= 10;
|
||||
}
|
||||
reverse(s.begin(), s.end());
|
||||
os << s;
|
||||
return os;
|
||||
}
|
||||
|
||||
|
||||
int main(){
|
||||
iostream::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
|
||||
|
||||
cin>>n>>m;
|
||||
for(ll i{1};i<=n;i++){
|
||||
if(i<=m){
|
||||
nds[i]={1,1};
|
||||
}else{
|
||||
nds[i]={0,1};
|
||||
}
|
||||
ll nn;
|
||||
cin>>nn;
|
||||
for(ll j{1};j<=nn;j++){
|
||||
ll d;
|
||||
cin>>d;
|
||||
adj[i].emplace_back(d);
|
||||
ind[d]++;
|
||||
}
|
||||
}
|
||||
queue<ll> qu;
|
||||
for(ll i{1};i<=n;i++){
|
||||
if(ind[i]==0){
|
||||
qu.emplace(i);
|
||||
}
|
||||
}
|
||||
while(qu.size()){
|
||||
auto u {qu.front()};
|
||||
qu.pop();
|
||||
for(auto &v:adj[u]){
|
||||
nds[v]=add(nds[v].first,nds[v].second,nds[u].first,nds[u].second*adj[u].size());
|
||||
if(--ind[v]==0){
|
||||
qu.emplace(v);
|
||||
}
|
||||
}
|
||||
}
|
||||
for(ll i{1};i<=n;i++){
|
||||
if(adj[i].size()==0){
|
||||
cout<<nds[i].first<<' '<<nds[i].second<<'\n';
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user