一、最大公约数和最小公倍数问题

题目描述:

输入2个正整数x0,y0(2<=x0<100000,2<=y0<=1000000),求出满足下列条件的P,Q的个数。

条件:1.P,Q是正整数;

2.要求P,Q以x0为最大公约数,以y0为最小公倍数。

试求: 满足条件的所有可能的两个正整数的个数。

输入描述:

每个测试文件包含不超过5组测试数据,每组两个正整数x0和y0(2<=x0<100000,2<=y0<=1000000)。

输出描述:

对于每组输入数据,输出满足条件的所有可能的两个正整数的个数。

下面是对样例数据的说明:

输入3 60

此时的P Q分别为:

3 60

15 12

12 15

60 3

所以,满足条件的所有可能的两个正整数的个数共4种。

#include<bits/stdc++.h>
using namespace std;
int gcd(int a,int b){
if(b==0)
return a;
return gcd(b,a%b);
} int main(){
int x,y;
while(~scanf("%d%d",&x,&y)){
int ans=0;
int mul=x*y;
for(int i=x;i<=y;i++){
if(mul%i!=0)
continue;
int k=mul/i;
if(x==gcd(i,k))
ans++;
}
cout<<ans<<endl;
}
return 0;
}

gcd(欧几里得又称辗转相除)算法

定理:两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。最大公约数(Greatest Common Divisor)缩写为GCD。

gcd(a,b) = gcd(b,a mod b) (不妨设a>b 且r=a mod b ,r不为0)

证明 :a可以表示成a = kb + r(a,b,k,r皆为正整数,且r<b),则r = a mod b

假设d是a,b的一个公约数,记作d|a,d|b,即a和b都可以被d整除。

而r = a - kb,两边同时除以d,r/d=a/d-kb/d=m,由等式右边可知m为整数,因此d|r

因此d也是b,a mod b的公约数

假设d是b,a mod b的公约数, 则d|b,d|(a-k*b),k是一个整数。

进而d|a.因此d也是a,b的公约数

因此(a,b)和(b,a mod b)的公约数是一样的,其最大公约数也必然相等,得证。

以下是gcd算法C++实现代码:

int Gcd(int a, int b)
{
if(b == 0)
return a;
return Gcd(b, a % b);
}

二、筱玛爱地理

点击查看题目描述

  • 这道看似简单的题把好多人都卡死在了分数取模上
  • 赛后题解中涉及到我这个蒟蒻的很多知识盲区orz
  • 先上代码再总结:
#include<bits/stdc++.h>
#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)//x是底数,y是指数
{//快速求模运算。
int ans1=1;
while (y)
{
if (y&1) //逐位“与”运算,通过和1相与,保留最后一位
{
ans1=1ll*ans1*x;
ans1=ans1%Mod;//ans1记录前面每次翻倍求模结果的乘积再求模
}
/*通过乘以1ll,将等号右边的精度提高到long long ,低精度向高精度转化,避免中间结果溢出范围,右边的ans现在是64位的int,原来32位的int型 10位数字,long long 19位数字, 1e+9是9位数字, 所以是32位还是64位都不会超出范围。 */
y>>=1;//右移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;
}

(一)inline关键字

1.在 c/c++ 中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了 inline 修饰符,表示为内联函数。

栈空间就是指放置程序的局部数据(也就是函数内数据)的内存空间。

在系统下,栈空间是有限的,假如频繁大量的使用就会造成因栈空间不足而导致程序出错的问题,如,函数的死循环递归调用的最终结果就是导致栈内存空间枯竭。

2.inline 的使用是有所限制的,inline 只适合涵数体内代码简单的函数使用,不能包含复杂的结构控制语句例如 while、switch,并且不能内联函数本身不能是直接递归函数(即,自己内部还调用自己的函数)。

3.inline 函数仅仅是一个对编译器的建议,所以最后能否真正内联,看编译器的意思,它如果认为函数不复杂,能在调用点展开,就会真正内联,并不是说声明了内联就会内联,声明内联只是一个建议而已。

慎用inline!!!

内联是以代码膨胀(复制) 为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。

如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。另一方面,每一处内联函数的调用都要复制代码,将使程序的总代码量增大,消耗更多的内存空间。

(二)求模运算

  • 费马小定理:对于质数p,任意整数a,均满足:$$a^p\equiv a(mod p)$$
  • 以下推导出分数求模
    • \[a^{p-1}modp\equiv1modp
      \]

    • \[a^{p-2}*amodp\equiv1modp
      \]

    • \[a^{p-2}modp\equiv\dfrac{1}{a}modp
      \]

    • \[a^{-n}modp\equiv a^{p-n-1}modp
      \]

  • 题中要求\(\beta =V/E\)中\(\beta\)的模,即可转化为:$$\beta mod p=V*\dfrac{1}{e}modp$$ (其中p=1e10+7)
  • 模运算具有以下性质:
    • \[(A+B)modp=(Amodp+Bmodp)modp
      \]

    • \[(A*B)modp=((Amodp)*(Bmodp))modp$$</p>

      \]

    (因为V<p所以mod后不变)

(三)按位与运算

  • 判断奇偶一般我用的是取余运算,今天学到还可以按位与判断奇偶
  • 按位与的优点:效率更高,时间更快
  • 原理:
    • 按位与是将两个数转化为二进制,若对应的位两数都为1,则结果中该位为1,否则该位为0
    • 一个数如果与1进行按位与运算,奇数转化为二进制后最后一位肯定为1,偶数肯定为0
if((x&1)==1)
printf("奇数");
else if((x&1)==0)
printf("偶数");

牛客竞赛(gcd,快速幂)的更多相关文章

  1. 2017 ECJTU ACM程序设计竞赛 矩阵快速幂+二分

    矩阵 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submission ...

  2. 2020牛客竞赛 DP F 碎碎念

    作者:儒生雄才1链接:https://ac.nowcoder.com/discuss/366644来源:牛客网 题目连接:https://ac.nowcoder.com/acm/contest/300 ...

  3. 牛客竞赛&&mjt的毒瘤赛

    题目链接 https://ac.nowcoder.com/acm/contest/368/F 思路 询问可以离线. 然后每个节点上建32个权值线段树(权值不大,其实只要20颗) 记录每一位权值为x(如 ...

  4. 牛客竞赛-Who killed Cock Robin

    Who killed Cock Robin? I, said the Sparrow, With my bow and arrow,I killed Cock Robin. Who saw him d ...

  5. 2019牛客竞赛第六场D Move 宏观单调,部分不单调

    Move 题意 有k个体积相同的箱子,有个憨憨有固定的装箱策略,每次都只装可以装的重量中最大的东西,求箱子的最小提及 分析 看起来可以二分,但由于他的装箱策略有点蠢,所以只在宏观上满足单调性,在特别小 ...

  6. 牛客竞赛第二场D Kth Minimum Clique 贪心+bitmap

    Kth Minimum Clique 题意 给出n(n<100)个点的邻接表,和n个点的权值,求第k大的团(完全子图) 分析 n很小,并且好像没有什么算法和这个有关系,所以可以往暴力枚举的方向想 ...

  7. 牛客练习赛43 Tachibana Kanade Loves Probability(快速幂)

    链接:https://ac.nowcoder.com/acm/contest/548/B来源:牛客网 题目描述 立华奏在学习初中数学的时候遇到了这样一道大水题: “设箱子内有 n 个球,其中给 m 个 ...

  8. 牛客网 牛客小白月赛12 B.华华教月月做数学-A^B mod P-快速幂+快速乘

    链接:https://ac.nowcoder.com/acm/contest/392/B来源:牛客网 华华教月月做数学 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其 ...

  9. 牛客网 牛客小白月赛1 I.あなたの蛙が帰っています-卡特兰数,组合数阶乘逆元快速幂

    I.あなたの蛙が帰っています   链接:https://www.nowcoder.com/acm/contest/85/I来源:牛客网     这个题有点意思,是卡特兰数,自行百度就可以.卡特兰数用处 ...

随机推荐

  1. 阿里云服务器(windows server 2012 r2 64位)安装MYSQL8.0.18数据库 (小白必备)

    今儿中午询问了朋友关于服务器的一些事情后,就开始安装了,从中午大概一点,整到晚上九点,终于装成功了,感觉安装过程能遇到的问题全遇到了,给后面的朋友一些参考意见把. 第一次碰云服务器,措辞不当或不正确之 ...

  2. 9、Spring Boot 2.x 集成 Thymeleaf

    1.9 Spring Boot 2.x 集成 Thymeleaf 完整源码: Spring-Boot-Demos 1.9.1 在pom中引入依赖 <dependency> <grou ...

  3. PHP mysqli_data_seek() 函数

    mysqli_data_seek() 函数调整结果指针到结果集中的一个任意行. // 假定数据库用户名:root,密码:123456,数据库:RUNOOB $con=mysqli_connect(&q ...

  4. 基本react-native模板

    import React, { Component } from 'react'; import { Text } from 'react-native'; export default class ...

  5. 【线性代数】4-4:正交基和Gram算法(Orthogonal Bases and Gram-Schmidt)

    title: [线性代数]4-4:正交基和Gram算法(Orthogonal Bases and Gram-Schmidt) categories: Mathematic Linear Algebra ...

  6. MySQL备忘点(下)

    联结表 创建联结 FROM 表1,表2 与内连接作用相同类似:如果失去WHERE子句,会出现笛卡尔积现象 内联结 INNER JOIN 高级联结 自联结 例子:SELECT 字段b FROM 表 WH ...

  7. 使用appium+python做UI自动化的demo

    使用appium+python做UI自动化的demo 案例使用的知乎app,下载最新的知乎apk,存在了电脑上,只需要配置本机上app目录,不需要再配置appPackage和appActivity # ...

  8. JavaWeb_(Spring框架)Spring中IoC与DI概念入门

    Spring是于2003 年兴起的一个轻量级的Java 开源框架,它由Rod Johnson创建.传统J2EE应用的开发效率低,Spring作为开源的中间件,提供J2EE应用的各层的解决方案,Spri ...

  9. Robot Framework(十六) 扩展RobotFramework框架——使用监听器接口

    4.3使用监听器接口 Robot Framework有一个侦听器接口,可用于接收有关测试执行的通知.监听器是具有某些特殊方法的类或模块,它们可以用Python和Java实现.监听器接口的示例用法包括外 ...

  10. PHP 之验证码类封装

    一.效果图 二.类代码 <?php /** * Created by PhpStorm. * User: Yang * Date: 2019/8/13 * Time: 10:51 */ clas ...