【算法每日一练]-快速幂,倍增,滑动窗口(保姆级教程 篇1) #麦森数 #青蛙跳

之前是考试准备,所以有几天没更新,今天开始继续更新

目录

 快速幂模板

 题目:麦森数

思路: 

 题目:青蛙跳 

思路: 


     

         

 快速幂模板

#include <bits/stdc++.h>        
#define ll long long
using namespace std;
ll a,b,p;
ll pow_fast(ll a,ll b,ll p){//快速幂模板(a是每个乘的底数,b是次数,p是mod)
	ll res=1;
	a%=p;
	while(b){//b减少,a翻倍,res存结果,p取模
		if(b&1) res=(res*a)%p;  //奇数的时候要提前拆出来一个1,然后放心除2
		a=(a*a)%p;
		b>>=1;
	}
	return res%p;
}
int main(){
	cin>>a>>b>>p;
	cout<<a<<"^"<<b<<" mod "<<p<<"="<<pow_fast(a,b,p)<<endl;
}

     

        

  题目:麦森数

       

思路: 

     

思想是不变的,只不过没法直接存数据了,那么就用数组存吧,开个a存结果,b存翻倍的底数,该乘乘该加加,没了。

     

注意一下求位数:2^p=10^x,当然x=p*log10(2.0)+1

     

           

#include<bits/stdc++.h>               
const long long mod=10000000000;
using namespace std;
const int N=2001;
int P, la=1,lb=1;//la是结果位数,lb是底数位数
int a[N],b[N],c[N];//a是结果,b是底数
void cheng1() {
    memset(c,0,sizeof(c));
    for (int i=1; i<=la; ++i)   {
        for (int j=1; j<=lb; ++j) {
            c[i+j-1] += a[i]*b[j];  //高精度的乘法规则
            c[i+j] += (c[i+j-1])/10;
            c[i+j-1] %= 10;
        }
    }
    int lc = la+lb; //高精度乘法的长度规则
    while(c[lc] == 0) --lc;//lc指向有效位
    memcpy(a,c,sizeof(c)); //三个参数:目标地址,源地址,数据长度
    la=lc>500?500:lc;
}
void cheng2() {
    memset(c,0,sizeof(c));
    for (int i=1; i<=lb; ++i)   {
        for (int j=1; j<=lb; ++j) {
            c[i+j-1] += b[i]*b[j];
            c[i+j] += (c[i+j-1])/10;
            c[i+j-1] %= 10;
        }
    }
    int lc = lb+lb;
    while(c[lc] == 0) --lc;
    memcpy(b,c,sizeof(c));
    lb=lc>500?500:lc;
}

void pow_fast() {
    while(P){
        if(P&1) cheng1();//拆出多余的1,结果a多乘一次底数b
        P>>=1;
        cheng2();//底数b平方
    }
}

int main() {
    scanf("%d",&P);
    printf("%d\n",int (P*log10(2.0)+1)); //求位数
    a[1] = 1; b[1] = 2;
    pow_fast();
    --a[1]; //2^p-1不要忘了还有减一呢
    for (int i = 500; i >= 1; --i) {
        printf("%d",a[i]);//输出结果
        if (!((i-1)%50)) printf("\n");
    }
    return 0;
}

         

         

 题目:青蛙跳 

        

        

思路: 

      

题意:有编号为1~n的 n只青蛙分别在第1~n点上,每次它们会跳到距离自己第 k近的点上。然后跳m次!

我尼玛这么大的数据咋做呀

       

首先我们要解决每个点第一次跳的地方,注意到k的范围,额,别想着暴力了。

那就引入滑动窗口,把最优的决策放左边(也可能是右边)过期的从左边丢掉即可 

 

注意一下:这个就是一个滑动窗口,大小不能变化,和“ 滑动窗口求区间中最值 ”不太一样。

你可以把后者理解成是固定窗口大小内维护一个单调队列,不同于这种固定大小的滑动窗口(只能滑动)

        

while(r+1<=n&&p[i]-p[l]>p[r+1]-p[i]) l++,r++;

这句话的意思是:当r+1的数更远时,无需移动;另外也隐含着r+1无限大的时候,一定r个数一定都在左边,那么当i取到r+1时会迫使窗口滑动!!!

for(R ll i=2;i<=n;i++)//滑动窗口大小位k+1,存放每个点能跳的k+1个点(包括自身)
{	                                 //(对上一个窗口处理)
	while(r+1<=n&&p[i]-p[l]>p[r+1]-p[i]) l++,r++;//窗口滑动若干格(如果新元素有更近的,那么最远的点必将淘汰,可能更新若干次哦)
	if(p[i]-p[l]>=p[r]-p[i]) f[i]=l;//之所以上个条件判断不取等,是因为取等时候我们会跳到下标更小的点
	else f[i]=r;//取值,要么是最左,要么是最右
}

 

#include<iostream> 
#include<cstdio>     
#include<queue>     
#include<cstring>
#define R register//命令编译器将变量存放在寄存器中,而不是内存中,这样不用内存访址了
#define MAXN 1000010 
typedef long long ll;
using namespace std;
ll n,k,m;
ll p[MAXN];
ll f[MAXN],ff[MAXN],ans[MAXN];//f数组存放每个点跳的下一个点
int main()
{
	scanf("%lld%lld%lld",&n,&k,&m);//n为青蛙数(也是点数)k是每次跳的距离,m是跳的次数
	for(R ll i=1;i<=n;i++) scanf("%lld",&p[i]);//输入每个点到起点的距离
	f[1]=k+1;//f[1]可以直接得出
	ll l=1,r=k+1;//滑动窗口模拟
	for(R ll i=2;i<=n;i++)//滑动窗口大小位k+1,存放每个点能跳的k+1个点(包括自身)
	{	                                 //(对上一个窗口处理)
		while(r+1<=n&&p[i]-p[l]>p[r+1]-p[i]) l++,r++;//窗口滑动若干格(如果新元素有更近的,那么最远的点必将淘汰,可能更新若干次哦)
		if(p[i]-p[l]>=p[r]-p[i]) f[i]=l;//之所以上个条件判断不取等,是因为取等时候我们会跳到下标更小的点
		else f[i]=r;//取值,要么是最左,要么是最右
	
	}
	
	for(R ll i=1;i<=n;i++) ans[i]=i;//初始跳0次
	while(m)//倍增(快速幂)
	{
		if(m&1) for(R ll i=1;i<=n;i++) ans[i]=f[ans[i]];//遇到奇数,就更新答案一次,相当于少跳一次
		m>>=1;
		memcpy(ff,f,sizeof(ff));//将f赋给ff
		for(R ll i=1;i<=n;i++) f[i]=ff[ff[i]];//这是叠加跳的步数,依次为1,2,4,8,16,32(每次的步数)

	}//再进一步解释:我们要的是整体跳m次,相当于跳(m/2)次*2步; 相当于跳(m/4)次*4步; 相当于跳(m/8)次*8步
	for(R ll i=1;i<=n;i++) printf("%lld ",ans[i]);
	return 0;//撒由那拉
}

 小插曲:个人感觉快速幂是慢慢从走一步到走多步的,而倍增是从慢慢走多步到走一步的(逼近嘛)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/136903.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

.net在使用存储过程中IN参数的拼接方案,使用Join()方法

有时候拼接SQL语句时&#xff0c;可能会需要将list中的元素都加上单引号&#xff0c;并以逗号分开&#xff0c;但是Join只能简单的分开&#xff0c;没有有单引号&#xff01; 1.第一种拼接方案 List<string> arrIds new List<string>(); arrIds.Add("aa&qu…

JavaScript_动态表格_删除功能

1、动态表格_删除功能 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>动态表格_添加和删除功能</title><style>table{border: 1px solid;margin: auto;width: 100%;}td,th{text-align: …

杂记 | 使用FRP搭建内网穿透服务(新版toml配置文件,搭配反向代理食用)

文章目录 01 需求与回顾02 下载程序包03 编辑.toml文件3.1 编辑frps.toml3.2 编辑frpc.toml 04 启动服务4.1 启动服务端4.2 启动客户端 05 配置反向代理&#xff08;可选&#xff09;06 windows设置为默认启动&#xff08;可选&#xff09;6.1 创建启动脚本6.2 设置为开机自启 …

【Java 进阶篇】Java与JQuery选择器:解锁前端开发的魔法大门

在前端开发的世界中&#xff0c;选择器是我们与HTML文档进行互动的钥匙&#xff0c;而Java和JQuery则为我们提供了强大的工具&#xff0c;使得前端开发不再是一个艰深的谜题。本篇博客将围绕Java与JQuery选择器展开&#xff0c;深入解析选择器的奥秘&#xff0c;为你打开前端开…

你一定要学会的Java语法 -- 【继承】

书接上回&#xff0c;我们已经学完了类和对象&#xff0c;今天内容可能有一点难&#xff0c;相信自己能跨过这道坎。 目录 一. 继承 1.什么是继承 2. 继承的概念 3. 继承的语法 4.父类成员访问 子类和父类成员变量同名 子类和父类成员方法同名 5.super关键字 6.子类构…

003、Nvidia Jetson Nano Developer KIT(b01)-深度学习环境配置

之——深度学习环境 杂谈 网上到处淘金&#xff0c;pytorch、opencv、torchvision。 正文 1.各种依赖库 1.1 pytorch的底层依赖库 sudo apt install build-essential make cmake cmake-curses-gui -ysudo apt install git g pkg-config curl -ysudo apt install libatlas-ba…

Java图像编程之:Graphics

一、概念介绍 1、Java图像编程的核心类 Java图像编程的核心类包括&#xff1a; BufferedImage&#xff1a;用于表示图像的类&#xff0c;可以进行像素级的操作。Image&#xff1a;表示图像的抽象类&#xff0c;是所有图像类的基类。ImageIcon&#xff1a;用于显示图像的类&a…

计算机中丢失msvcr120.dll文件怎么修复?找不到msvcr120.dll五种完美修复方案

今天我想和大家分享的是关于“msvcr120.dll丢失的问题的5个解决方法”。在我们日常的工作生活中&#xff0c;或许大家都曾遇到过这样的问题&#xff0c;那么&#xff0c;了解它的解决方法是非常必要的。 首先&#xff0c;让我们来了解一下msvcr120.dll是什么文件。简单来说&am…

“艾迪-东软杯”第六届武汉理工大学新生程序设计竞赛

A.Capoos Acronym Zero 题目描述 yz 和他的朋友 ea 和 zech 一起养了一群 Capoo。 这些 Capoo 非常聪明&#xff0c;但不知道为什么&#xff0c;它们并没有从三人那里学到怎么写算法题&#xff0c;而是出于某种原因开始研究语言学&#xff0c;并发明了一套自己的暗语。这门暗语…

二分图判定和二分图最大匹配

1.二分图的定义 二分图是一种特殊的无向图&#xff0c;它的节点可以被划分为两个互不相交的集合&#xff0c;使得同一集合中的任意两个节点之间没有边相连&#xff0c;而不同集合中的节点之间都有边相连。 换句话说&#xff0c;如果一个无向图可以被划分为两个集合&#xff0…

Keil文本对齐

摘要&#xff1a;通常我们写代码的时候&#xff0c;尤其是缩进和{}的使用&#xff0c;很多都需要自己手动去调整&#xff0c;如果有一个自动格式化代码的工具&#xff0c;每次编辑完代码&#xff0c;然后一键给将代码格式化&#xff0c;即省时又美观。为了解决这个问题&#xf…

面向对象高级

本期对应知识库&#xff1a;&#xff08;持续更新中&#xff01;&#xff09; 面向对象高级 (yuque.com) ​​​​​​​尚硅谷_宋红康_对象内存解析.pptx static 适用于公用变量 开发中&#xff0c;变量 经常把一些常量设置为静态static 例如 PI 方法 经常把工具类中的方…

Deepsort项目详解

一、目标追踪整体代码 代码目录如下图所示&#xff1a; 、 追踪相关代码&#xff1a; 检测相关代码和权重 调用 检测 和 追踪的代码&#xff1a; 首先代码分为三个部分&#xff1a; 目标追踪的相关代码和权重目标检测相关代码和权重&#xff0c;这里用的是yolov5.5目标检…

Thinkphp8 - 连接多个数据库

// 数据库连接配置信息connections > [mysql > [// 数据库类型type > mysql,// 服务器地址hostname > 127.0.0.1,// 数据库名database > thinkphp,// 用户名username > env(DB_USER, root),// 密码password >…

layui 表格(table)合计 取整数

第一步 开启合计行 是否开启合计行区域 table.render({elem: #myTable, url: ../baidui/, page: true, cellMinWidth: 100,totalRow:true,cols: [[ //表头//{ type: checkbox },{ type: checkbox,totalRowText: "合计" },//合计行区域{ field: id, align: center,…

【0基础学Java第九课】-- 抽象类和接口

9. 抽象类和接口 9.1 抽象类9.1.1 抽象类概念9.1.2 抽象类语法9.1.3 抽象类的特性9.1.4 抽象类的作用 9.2 接口9.2.1 接口的概念9.2.2 语法规则9.2.3 接口使用9.2.4 接口特性9.2.5 实现多个接口9.2.6 接口的继承9.2.9 抽象类和接口的区别 9.3 Object类9.3.1 获取对象方法9.3.1 …

基于springboot实现驾校管理系统项目【项目源码】计算机毕业设计

基于springboot实现驾校管理系统演示 JAVA简介 JavaScript是一种网络脚本语言&#xff0c;广泛运用于web应用开发&#xff0c;可以用来添加网页的格式动态效果&#xff0c;该语言不用进行预编译就直接运行&#xff0c;可以直接嵌入HTML语言中&#xff0c;写成js语言&#xff0…

小H靶场学习笔记:DC-2

DC-2 Created: November 10, 2023 3:01 PM Tags: WordPress, git提权, rbash逃逸 Owner: 只会摸鱼 靶场过程 信息收集 扫描存活主机&#xff0c;找到靶机ip&#xff1a;192.168.199.131&#xff08;本机是192.168.199.129&#xff09; 扫描端口开放协议 发现有80端口和77…

电路设计之36V 自动断电和防浪涌电路

1. 电路图纸 2. 解释防浪涌功能怎么实现的 1. 首先当电源上电的一瞬间是 电容C1 是相当于短路的。 &#xff08;电容的充电状态。电容充电相当于短路状态&#xff09; 2. 当上电的一瞬间是有 浪涌的。 3.当上电的瞬间有浪涌的&#xff0c;此时电容C1 相当于短路&#xff0c;所…

Java学习_对象

对象在计算机中的执行原理 类和对象的一些注意事项 this关键字 构造器 构造器是一种特殊的方法 : 特殊之处在于&#xff0c;名字必须与所在类的名字一样&#xff0c;而且不能写返回值类型 封装 封装的设计规范&#xff1a;合理隐藏、合理暴露 实体类 成员变量和局部变量的区别 …