//Jakub Nowak XIV LO Wroclaw #include<bits/stdc++.h> using namespace std; typedef long long int ll; #define pb push_back const ll mxll = 1e18; const __int128 P = __int128(mxll/100)*__int128(mxll/100); struct super_int{ vector<__int128> V={0}; void fix() { for(int i=0; i<V.size()-1; i++) { V[i+1]+=(V[i]/P); V[i]%=P; } if(V.back()!=0) V.pb(0); } super_int(__int128 x) { V[0]=x; fix(); } super_int() { V[0]=0; } void operator*=(__int128 x) {//x<=100 for(auto &u:V) u*=x; fix(); } bool operator==(__int128 x) {//x=0 for(auto u:V) if(u) return false; return true; } __int128 operator%(__int128 x) {//x<=100 __int128 wynik=0; for(int i=V.size()-1; i>=0; i--) { wynik*=P; wynik+=V[i]; wynik%=x; } return wynik; } void operator/=(__int128 x) {//x<=100 for(int i=V.size()-1; i>=1; i--) { V[i-1]+=P*(V[i]%x); V[i]/=x; } V[0]/=x; fix(); } super_int operator/(__int128 x) {//x<=100 super_int ans(0); for(int i=0; i<V.size(); i++) { if(ans.V.size()<=i) ans.V.pb(0); ans.V[i]=V[i]; } ans/=x; return ans; } void operator+=(super_int x) {//ok while(V.size()<x.V.size()) V.pb(0); for(int i=0; i<x.V.size(); i++) V[i]+=x.V[i]; fix(); } }; #define pb push_back typedef vector<int> vi; const int N = 107; int n; super_int wynik(1);//1<=n<=100 vi G[N];//G[i] = wektor krawedzi wychodzacych z i-tej platformy super_int W[N];//W[i] = liczba walizek docierajacych do i-tej platformy void domnoz(int xile) { wynik*=xile; for(int i=1; i<=n; i++) W[i]*=xile; } void wypisz_wynik() {//ok string S=""; while(!(wynik==0)) { S+=char((wynik%10)+'0'); wynik/=10; } reverse(S.begin(),S.end()); cout<<S; } int nwd(int a, int b) {//a>=b if(b==0) return a; a%=b; return nwd(b,a); } void deb() { cout<<"\n---------deb----------\n"; cout<<"Rozmiar wynik.V: "<<wynik.V.size()<<"\n"; cout<<"Czy wynik ==0: "<<(wynik==0)<<"\n"; cout<<"Czy wynik%10 == 0: "<<((wynik%10)==0)<<"\n"; cout<<"Czy wynik/10 == 0: "<<((wynik/10)==0)<<"\n"; cout<<"Wynik (recznie): "<<ll(wynik.V[1]/mxll)<<ll(wynik.V[1]%mxll)<<ll(wynik.V[0]/mxll)<<ll(wynik.V[0]%mxll)<<"\n"; cout<<"Wynik (wypisz()): "; wypisz_wynik(); } int32_t main() { /* for(int i=1; i<=60; i++) wynik*=i; deb(); return 0; */ // ios_base::sync_with_stdio(false); cin.tie(0); W[1]=super_int(1); //deb(); //return 0; //-------wczytywanie----- cin>>n; for(int i=1; i<=n; i++) { int r, a; cin>>r; while(r--) { cin>>a; G[i].pb(a); } } //-------liczenie------- for(int i=1; i<=n; i++) { if(W[i]==0||G[i].size()==0) continue; domnoz(G[i].size()/nwd(G[i].size(), W[i]%G[i].size())); for(auto u:G[i]) W[u]+=(W[i]/G[i].size()); } wypisz_wynik(); }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 | //Jakub Nowak XIV LO Wroclaw #include<bits/stdc++.h> using namespace std; typedef long long int ll; #define pb push_back const ll mxll = 1e18; const __int128 P = __int128(mxll/100)*__int128(mxll/100); struct super_int{ vector<__int128> V={0}; void fix() { for(int i=0; i<V.size()-1; i++) { V[i+1]+=(V[i]/P); V[i]%=P; } if(V.back()!=0) V.pb(0); } super_int(__int128 x) { V[0]=x; fix(); } super_int() { V[0]=0; } void operator*=(__int128 x) {//x<=100 for(auto &u:V) u*=x; fix(); } bool operator==(__int128 x) {//x=0 for(auto u:V) if(u) return false; return true; } __int128 operator%(__int128 x) {//x<=100 __int128 wynik=0; for(int i=V.size()-1; i>=0; i--) { wynik*=P; wynik+=V[i]; wynik%=x; } return wynik; } void operator/=(__int128 x) {//x<=100 for(int i=V.size()-1; i>=1; i--) { V[i-1]+=P*(V[i]%x); V[i]/=x; } V[0]/=x; fix(); } super_int operator/(__int128 x) {//x<=100 super_int ans(0); for(int i=0; i<V.size(); i++) { if(ans.V.size()<=i) ans.V.pb(0); ans.V[i]=V[i]; } ans/=x; return ans; } void operator+=(super_int x) {//ok while(V.size()<x.V.size()) V.pb(0); for(int i=0; i<x.V.size(); i++) V[i]+=x.V[i]; fix(); } }; #define pb push_back typedef vector<int> vi; const int N = 107; int n; super_int wynik(1);//1<=n<=100 vi G[N];//G[i] = wektor krawedzi wychodzacych z i-tej platformy super_int W[N];//W[i] = liczba walizek docierajacych do i-tej platformy void domnoz(int xile) { wynik*=xile; for(int i=1; i<=n; i++) W[i]*=xile; } void wypisz_wynik() {//ok string S=""; while(!(wynik==0)) { S+=char((wynik%10)+'0'); wynik/=10; } reverse(S.begin(),S.end()); cout<<S; } int nwd(int a, int b) {//a>=b if(b==0) return a; a%=b; return nwd(b,a); } void deb() { cout<<"\n---------deb----------\n"; cout<<"Rozmiar wynik.V: "<<wynik.V.size()<<"\n"; cout<<"Czy wynik ==0: "<<(wynik==0)<<"\n"; cout<<"Czy wynik%10 == 0: "<<((wynik%10)==0)<<"\n"; cout<<"Czy wynik/10 == 0: "<<((wynik/10)==0)<<"\n"; cout<<"Wynik (recznie): "<<ll(wynik.V[1]/mxll)<<ll(wynik.V[1]%mxll)<<ll(wynik.V[0]/mxll)<<ll(wynik.V[0]%mxll)<<"\n"; cout<<"Wynik (wypisz()): "; wypisz_wynik(); } int32_t main() { /* for(int i=1; i<=60; i++) wynik*=i; deb(); return 0; */ // ios_base::sync_with_stdio(false); cin.tie(0); W[1]=super_int(1); //deb(); //return 0; //-------wczytywanie----- cin>>n; for(int i=1; i<=n; i++) { int r, a; cin>>r; while(r--) { cin>>a; G[i].pb(a); } } //-------liczenie------- for(int i=1; i<=n; i++) { if(W[i]==0||G[i].size()==0) continue; domnoz(G[i].size()/nwd(G[i].size(), W[i]%G[i].size())); for(auto u:G[i]) W[u]+=(W[i]/G[i].size()); } wypisz_wynik(); } |