各位佬
我在做NOIP2020T1排水系统
我现在要存一个值为60^11次方的数
longlong存不下现在用double,怎么求gcd
如果不能可以帮我改成int_128吗
代码如下
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll MAXN = 100005;
const double mx = (pow(60,11));
#define rep(i,a,b) for(ll i = a;i <= b;i++)
ll n,m,sz[MAXN],x,icnt[MAXN];
double res[MAXN];
vector<int> ed[MAXN];
void read(void){
// freopen("water.in","r",stdin);
// freopen("water.out","w",stdout);
scanf("%lld%lld",&n,&m);
rep(i,1,n){
scanf("%lld",&sz[i]);
rep(j,1,sz[i]){
scanf("%lld",&x);
ed[i].push_back(x);
icnt[x]++;
}
}
}
void dfs(ll x,double q){
// cout << x << " " << mx / q << endl;
if(sz[x] == 0){
res[x] += mx / q;
return;
}
for(auto v : ed[x])dfs(v,q * ed[x].size());
}
ll gcd(ll a,double b){
return (b == 0) ? a : gcd(b,a % b);
}
void solve(){
ll sum = 0;
rep(i,1,n)if(icnt[i] == 0)dfs(i,1),++sum;
rep(i,1,n)res[i] *= sum;
rep(i,1,n)if(sz[i] == 0)printf("%.0lf %.0lf\n",res[i] * 1.0 / gcd(res[i],mx),mx * 1.0 / gcd(res[i],mx));
}
int main(){
read();
solve();
return 0;
}