题目链接:https://ac.nowcoder.com/acm/contest/946/A/
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
题目描述
筱玛是一个热爱地理的好筱玛。最近,在《地理II》作业本上,筱玛学到了“贝塔指数”的概念:
在经济地理学中,交通的联结度表示交通网络的发达程度,通常用贝塔指数来计算与比较。若用V表示一个交通网络中结点的数量,用E表示边的数量,则贝塔指数的计算方式为:β=EV。
“实践是检验真理的唯一标准”。作为一个热爱地理的好筱玛,她马上就把新学的知识应用到实践当中去。筱玛一口气出了n张交通网络规划图,其中第i张交通网络Gi有Vi个结点和Ei条边。筱玛一眼就看出了哪张图好、哪张图坏。但是作为一个负责任的好筱玛,她必须带领同学们一起进步。因此,她需要你将所有的n张图按照贝塔指数排序,并求出它们各自的贝塔指数在模10^9+7意义下的值。
输入描述
第一行一个整数n,表示交通网络规划图的数量。
接下来n行,每行两个整数Vi和Ei,分别表示图Gi中的结点数量和边的数量。
输出描述
输出共n行,每行一个数,表示贝塔指数第i大的交通网络的贝塔指数在模10^9+7意义下的值。
如果不能整除,输出分数取模后的结果。
输入
1
1 3
输出
3
说明
显然此时β=EV=3。
备注
对于100%的数据,保证1≤n≤2×10^5,1≤Vi,Ei≤10^9。
解题思路
将给定的n个数按照E[i]/V[i]排序,再求逆元即可,注意比较大小时用乘法,不要直接除避免精度误差。
Accepted Code:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 200010;
const int MOD = 1e9 + 7;
struct edge {
int v, e;
bool operator < (const edge &S) const {
return 1ll * e * S.v > 1ll * S.e * v;
}
}G[N];
ll POW(ll a, ll b = MOD - 2, ll c = MOD) {
ll res = 1;
ll base = a % c;
while (b) {
if (b & 1)
res = (res * base) % c;
base = (base * base) % c;
b >>= 1;
}
return res;
}
int main() {
int n;
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d%d", &G[i].v, &G[i].e);
sort(G + 1, G + n + 1);
for (int i = 1; i <= n; i++)
cout << G[i].e * POW(G[i].v) % MOD << endl;
return 0;
}