A题
链接:https://ac.nowcoder.com/acm/contest/946/A
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 524288K,其他语言1048576K
64bit IO Format: %lld
题目描述
筱玛是一个热爱地理的好筱玛。最近,在《地理II》作业本上,筱玛学到了“贝塔指数”的概念:
#include<bits/stdc++.h>
#define 64 long long//不管32位还是64位的,int都是4个字节,一个字节8位,即32位
//long long 都是8个字节,那么就是64位,这句话的作用就是将原来的int_32 型 改成int_64型,
//在一些预编译里面还会出现 #define _int64 long long的语句,c99标准之后,64位的int都用long long
//来表示,这里可以理解为处理标准兼容的问题。
#define N 500005
using namespace std;
const int Mod=1e9+7;//科学计数法
struct node{int x, y;}a[N];//定义结构体的同时,定义大小为N的结构体数组。
inline bool cmp(node aa,node bb){return aa.y*bb.x>aa.x*bb.y;}//避免精度问题。
inline int ksm(int x,int y){//求模运算,这里是快速求模运算。
//VS 2017虽然把__int64作为了一种内置类型,但是也做了类似的处理,使得__int64与long long没有肉眼可见的差别。
int ans1=1;
while (y){
if (y&1) //逐位与运算,通过和1相与,保留最后一位
ans1=1ll*ans1*x%Mod;//通过乘以1ll,将等号右边的精度提高到long long ,低精度向高精度转化,避免中间结果溢出范围,右边的ans现在是64位的int
//原来32位的int型 10位数字,long long 19位数字, 1e+9是9位数字, 所以是32位还是64位都不会超出范围。
y>>=1;//右移相当除以2,类比十进数,右移一位相当于除以10,同理左移,是乘以相应的进制基数。
x=1ll*x*x%Mod;//x中记录每次翻倍的求模的结果。
}
return ans1;
}
signed main(){
int n;
scanf("%lld",&n);
for (int i=1;i<=n;i++)
scanf("%lld%lld",&a[i].x,&a[i].y);//注意结构体的输入方式。
sort(a+1,a+n+1,cmp);//i=1开始,所以起始位置为a+1
for (int i=1;i<=n;i++)
printf("%lld\n",a[i].y*ksm(a[i].x,Mod-2)%Mod);//分数求模的定理转换。
return 0;
}