分数取模(快速取模法+小费马定理)_WarrenChou_的博客-程序员秘密

技术标签: 算法  # 数论  快速取模  

这周打了牛客竞赛周赛,结果在第一道题就卡死了(呜呜呜)
这是原题牛客练习赛49
拿到题后,本蒟蒻想着不就是一道排序题吗,就直接写了一个快速排序输出,结果直接WA了。
百思不得其解,这时后台发来了一个广播消息:提示:如果不能整除,输出分数取模后的结果。
what???分数取模,虽然刚刚学过密码学的时候接触过,但不知道算法怎么写啊,果断地去百度了一下,找到了小费马定理: a p − 1 m o d p = 1 m o d p a^{p-1} mod p = 1 mod p ap1modp=1modp,对这个定理稍稍改动一下: a p − 2 m o d p = a − 1 m o d p a^{p-2} mod p = a^{-1} mod p ap2modp=a1modp,所以 ( b / a ) % p = b ∗ a − 1 % p = b ∗ a p − 2 % p (b/a)\%p=b*a^{-1}\%p=b *a ^{p-2}\%p (b/a)%p=ba1%p=bap2%p
你以为到这里就完了吗,这道题 p = 1 e 9 + 7 p=1e9+7 p=1e9+7。。。
所以,这里又要介绍一种快速取模法了,它适用于大指数的模运算,用扩展欧几里得定理可以求出这个模,这里先上代码

int ksm(int a ,int k) //a代表底数,k代表大指数
{
    
    int rec = 1;
    while( k )
    {
    
        if (k & 1)
            rec *= a;
        a *= a;
        k >>= 1;
    }
    return rec;
}

& \& & 表示的是 k k k这一位是否为 1 1 1即判断是否为奇数, K > > = K>>= K>>= 表示 K K K的位置右移一位, w h i l e ( K ) while(K) while(K)是直到 K K K移到最后一位的时候弹出。
举个例子, 3 13 3^{13} 313 13 = 1 ∗ 2 3 + 1 ∗ 2 2 + 0 ∗ 2 1 + 1 ∗ 2 0 13=1* 2^ 3+1* 2^ 2+0* 2^ 1+1* 2^ 0 13=123+122+021+120;那么第一次 K = 13 K=13 K=13;这个时候 K & 1 K\&1 K&1表示探查 2 0 2^ 0 20的这一位是否为 1 1 1;为 1 1 1,则进行 r e c ∗ = a rec*=a rec=a k > > = 1 k>>=1 k>>=1表示将13右移一位,即 13 / 2 13/2 13/2;可以在之前的 13 13 13的上面直接表示出来。 6 = 1 ∗ 2 2 + 1 ∗ 2 1 + 0 ∗ 2 0 6=1* 2^ 2+1* 2^ 1+0* 2^ 0 6=122+121+020;这个时候, k & 1 k\&1 k&1则为0了。因为 2 0 2^0 20的系数是0;
.
.
.
至此,这道题就可以AC出来了,另外要注意的是定义整型变量的时候要防止越界,所以题目全部用了 l o n g   l o n g long\ long long long型变量,比较大小时用乘法,不要直接除避免精度误差。

我的AC代码

#include <bits/stdc++.h>
using namespace std;
#define N 500000
const long long mod=1e9+7;
struct node{
    
    long long x;
    long long y;
}a[N];
long long ksm(long long x,long long y){
    
    long long ans=1;
    while(y){
    
        if(y&1) ans=ans*x%mod;
        y>>=1;
        x=x*x%mod;
    }
    return ans;
}
bool cmp(node a,node b)
{
    
    return a.y*b.x>b.y*a.x;
}
int main()
{
    
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
    
        cin>>a[i].x>>a[i].y;
    }
    sort(a,a+n,cmp);
    for(int i=0;i<n;i++){
    
        cout<<a[i].y*ksm(a[i].x,mod-2)%mod<<endl;
    }
    return 0;
}

看完了,给个赞再走呗^ - ^

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43916464/article/details/95180573

智能推荐

HSI颜色模型_hsi中的h范围_Hustudent20080101的博客-程序员秘密

相关术语hslcamshift色彩空间颜色模型灰度图像图像匹配灰度图灰度值HSI颜色模型编辑锁定本词条缺少名片图,补充相

hadoop 2.7.4:java.lang.UnsupportedClassVersionError: org/apache/hadoop/mapreduce/lib/output/Sequence_qq_33364884的博客-程序员秘密

STARTUP_MSG: java = 1.7.0_79************************************************************/17/10/02 15:32:29 INFO namenode.NameNode: registered UNIX signal handlers for [TERM, HUP, INT]17/10/02 15:

归并排序-----HashMap和HashTable之间的区别---迭代器模式---DDL、DML、DQL、DCL、TCL语句的概念与区别_迭代了dml_哪有长胜无敌的博客-程序员秘密

归并排序归并排序是通过合并多个有序序列的排序方法,是运用分支法的典型范例。主要步骤划分:将待排序的序列划分为大小大致相等的两个子序列。治理:当子序列的规模大于1时,递归排序子序列,如果子序列规模为1则称为有序序列。组合:将两个有序序列合并为一个有序序列。HashMap和HashTable之间的区别HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。HashMap的...

正则表达式:概述、在 JavaScript 中的使用、以及正则表达式中的特殊字符和替换_正则表达式替换特殊字符__Tough_Girl的博客-程序员秘密

1、正则表达式概述2、正则表达式在 JavaScript 中的使用3、 正则表达式中的特殊字符4、正则表达式中的替换

术语-抽象:抽象_weixin_30273763的博客-程序员秘密

ylbtech-术语-抽象:抽象从具体事物抽出、概括出它们共同的方面、本质属性与关系等,而将个别的、非本质的方面、属性与关系舍弃,这种思维过程,称为抽象。1.返回顶部 1、中文名:抽象外文名:abstract种类:质的抽象和本质的抽象原意:是排除、抽出目录1定义2释义3抽...

flutter学习(5)GridView_临风而眠的博客-程序员秘密

flutter学习(5) GridViewGridview是网格布局文章目录flutter学习(5) GridView一.GridView常用属性二.GridView.count 实现网格布局三.GridView.builder实现网格布局一.GridView常用属性二.GridView.count 实现网格布局看这个import 'package:flutter/material.dart';import './res/listData.dart';void main() =&

随便推点

用Java连接SQL Server2000数据库的两种方法与jDTS_inrgihc的博客-程序员秘密

1. 通过Microsoft的JDBC驱动连接此JDBC驱动共有三个文件,分别是mssqlserver.jar、msutil.jar和msbase.jar,可以到微软的网站去下载(http://www.microsoft.com/downloads/details.aspx?FamilyId=07287B11-0502-461A-B138-2AA54BFDC03A&amp;displaylan...

Linux用户、组、密码管理_weixin_34224941的博客-程序员秘密

本文主要总结了Linux用户、组管理的常用命令及选项。一、用户管理1、添加用户命令:useradd-uUID,有效范围0-65536-gGID,必需是已存在的-GGID,附加组,必需是已存在的-c注释-d指定用户目录-s指定用户shell-r创建系统用户(UID在1-499间),系统用户不会自动创建家目录-m必须为用户创建家目录-M不为用户创建家目录passwd USERNA...

STM32之USB虚拟串口通讯无法接收0x0d问题解决方式_虚拟串口接收不到数据_大桶矿泉水的博客-程序员秘密

记录在使用stm32的usb虚拟串口通讯时,无法接收0x0d字节,并且后续数据断包问题。

基于STM32的电压采集(电压表)系统设计(程序)_基于stm32的电压数据采集系统设计_电子开发圈的博客-程序员秘密

1. ①电压输入范围ADC 输入范围为:VREF- ≤ VIN ≤ VREF+。由 VREF-、VREF+ 、VDDA 、VSSA、这四个外部引脚决定。我们在设计原理图的时候一般把 VSSA 和 VREF-接地,把 VREF+和 VDDA 接 3V3,得到ADC 的输入电压范围为:0~3.3V。如果我们想让输入的电压范围变宽,去到可以测试负电压或者更高的正电压,我们可以在外部加一个电压调理电路,把需要转换的电压抬升或者降压到 0~3.3V,这样 ADC 就可以测量了。

STM32工程模板建立 - Simu 目标_基于标准外设库新建工程模板实验目的_电子开发圈的博客-程序员秘密

首先从最基本的 Sim 目标开始,其他目标都将在此基础进行更改。根据本笔记的仿真一节进行设置,获得基本的仿真功能。这个时候如果点击 debug 选项是可以进入 Debug 模式的。但因为这是进阶的文章,要稍微高大上一些,所以直接从 uCOS II 工程开始,关于 uCOS II 的移植可以参考网上资料,也可以参考本笔记的系统章节,不再详述,因为本节主要讲解的是模板的建立,是一个综合性很强的内容,所以如果基础薄弱的需要多学习其他基础内容,不懂的上网搜索或者查看本笔记是否有相关的内容。言归正传,因为

推荐文章

热门文章

相关标签