这周打了牛客竞赛周赛,结果在第一道题就卡死了(呜呜呜)
这是原题牛客练习赛49
拿到题后,本蒟蒻想着不就是一道排序题吗,就直接写了一个快速排序输出,结果直接WA了。
百思不得其解,这时后台发来了一个广播消息:提示:如果不能整除,输出分数取模后的结果。
what???分数取模,虽然刚刚学过密码学的时候接触过,但不知道算法怎么写啊,果断地去百度了一下,找到了小费马定理: a p − 1 m o d p = 1 m o d p a^{p-1} mod p = 1 mod p ap−1modp=1modp,对这个定理稍稍改动一下: a p − 2 m o d p = a − 1 m o d p a^{p-2} mod p = a^{-1} mod p ap−2modp=a−1modp,所以 ( 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=b∗a−1%p=b∗ap−2%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=1∗23+1∗22+0∗21+1∗20;那么第一次 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=1∗22+1∗21+0∗20;这个时候, 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;
}
看完了,给个赞再走呗^ - ^
相关术语hslcamshift色彩空间颜色模型灰度图像图像匹配灰度图灰度值HSI颜色模型编辑锁定本词条缺少名片图,补充相
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:
归并排序归并排序是通过合并多个有序序列的排序方法,是运用分支法的典型范例。主要步骤划分:将待排序的序列划分为大小大致相等的两个子序列。治理:当子序列的规模大于1时,递归排序子序列,如果子序列规模为1则称为有序序列。组合:将两个有序序列合并为一个有序序列。HashMap和HashTable之间的区别HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。HashMap的...
1、正则表达式概述2、正则表达式在 JavaScript 中的使用3、 正则表达式中的特殊字符4、正则表达式中的替换
ylbtech-术语-抽象:抽象从具体事物抽出、概括出它们共同的方面、本质属性与关系等,而将个别的、非本质的方面、属性与关系舍弃,这种思维过程,称为抽象。1.返回顶部 1、中文名:抽象外文名:abstract种类:质的抽象和本质的抽象原意:是排除、抽出目录1定义2释义3抽...
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() =&
1. 通过Microsoft的JDBC驱动连接此JDBC驱动共有三个文件,分别是mssqlserver.jar、msutil.jar和msbase.jar,可以到微软的网站去下载(http://www.microsoft.com/downloads/details.aspx?FamilyId=07287B11-0502-461A-B138-2AA54BFDC03A&displaylan...
本文主要总结了Linux用户、组管理的常用命令及选项。一、用户管理1、添加用户命令:useradd-uUID,有效范围0-65536-gGID,必需是已存在的-GGID,附加组,必需是已存在的-c注释-d指定用户目录-s指定用户shell-r创建系统用户(UID在1-499间),系统用户不会自动创建家目录-m必须为用户创建家目录-M不为用户创建家目录passwd USERNA...
SpringBoot用户鉴权以及统一获取用户信息
记录在使用stm32的usb虚拟串口通讯时,无法接收0x0d字节,并且后续数据断包问题。
1. ①电压输入范围ADC 输入范围为:VREF- ≤ VIN ≤ VREF+。由 VREF-、VREF+ 、VDDA 、VSSA、这四个外部引脚决定。我们在设计原理图的时候一般把 VSSA 和 VREF-接地,把 VREF+和 VDDA 接 3V3,得到ADC 的输入电压范围为:0~3.3V。如果我们想让输入的电压范围变宽,去到可以测试负电压或者更高的正电压,我们可以在外部加一个电压调理电路,把需要转换的电压抬升或者降压到 0~3.3V,这样 ADC 就可以测量了。
首先从最基本的 Sim 目标开始,其他目标都将在此基础进行更改。根据本笔记的仿真一节进行设置,获得基本的仿真功能。这个时候如果点击 debug 选项是可以进入 Debug 模式的。但因为这是进阶的文章,要稍微高大上一些,所以直接从 uCOS II 工程开始,关于 uCOS II 的移植可以参考网上资料,也可以参考本笔记的系统章节,不再详述,因为本节主要讲解的是模板的建立,是一个综合性很强的内容,所以如果基础薄弱的需要多学习其他基础内容,不懂的上网搜索或者查看本笔记是否有相关的内容。言归正传,因为