牛客练习赛49场01题解分析

牛客练习赛49场—01筱玛爱地理


对于题解的理解,没错,你没听错,是对于题解的理解(小声的说下)

题目链接参考:https://ac.nowcoder.com/acm/contest/946/A

下面直接我注释好的cpp文件原件内容了哈

#include
#define int 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;
}

关于模运算这里就不赘述,上我手写的几张图,帮助大家理解这个求模的函数。
牛客练习赛49场01题解分析_第1张图片
牛客练习赛49场01题解分析_第2张图片
下面是关于这道题的相关的链接

1. 费马小定理:建议百度,第一个博客,下面是关于位运算,inline函数的使用,我也分不清了,下次做好笔记,哭唧唧。
2. long long 与 64位的区别:
  https://blog.csdn.net/CV_Jason/article/details/85244813?      tdsourcetag=s_pcqq_aiomsg

3. https://blog.csdn.net/CV_Jason/article/details/85244813?tdsourcetag=s_pcqq_aiomsg

​ 4.https://blog.csdn.net/pt666/article/details/7051082

​ 5.https://blog.csdn.net/qq_34364995/article/details/80544465

  6  https://blog.csdn.net/qq_34364995/article/details/80544465

​ 7.https://blog.csdn.net/godleaf/article/details/79844074

你可能感兴趣的:(算法题目分析)