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

news2024/12/26 11:50:24

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

目录

 快速幂模板

 题目:麦森数

思路: 

 题目:青蛙跳 

思路: 


     

         

 快速幂模板

#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;//撒由那拉
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【QT】飞机大战

0 项目简介 飞机大战是我们大家所熟知的一款小游戏&#xff0c;本教程就是教大家如何制作一款自己的飞机大战 首先我们看一下效果图 玩家控制一架小飞机&#xff0c;然后自动发射子弹&#xff0c;如果子弹打到了飞下来的敌机&#xff0c;则射杀敌机&#xff0c;并且有爆炸的特…

Java事务详解

一、事务的理解&#xff1a; 1、事务的特性&#xff1a; 1) 原子性&#xff08;atomicity&#xff09;&#xff1a;事务是数据库的逻辑工作单位&#xff0c;而且是必须是原子工作单位&#xff0c;对于其数据修改&#xff0c;要么全部执行&#xff0c;要么全部不执行。 2) 一致性…

SparkSQL之Analyzed LogicalPlan生成过程

经过AstBuilder的处理&#xff0c;得到了Unresolved LogicalPlan。该逻辑算子树中未被解析的有UnresolvedRelation和UnresolvedAttribute两种对象。Analyzer所起到的主要作用就是将这两种节点或表达式解析成有类型的&#xff08;Typed&#xff09;对象。在此过程中&#xff0c;…

AI时代设计工具Motiff亮相世界互联网大会 带来AI在SaaS领域落地应用案例

11月8日&#xff0c;2023年世界互联网大会再次迎来“乌镇时间”&#xff0c;AI时代设计工具Motiff正式亮相。期间&#xff0c;Motiff运营副总裁张昊然出席“新产品新技术”发布会&#xff0c;并发表《Motiff&#xff1a;AI时代设计工具的应用与实践》主题演讲&#xff0c;他表示…

【Linux网络】本地DNS服务器搭建

目录 一、什么是DNS&#xff0c;相关介绍 1、dns是什么&#xff1a; 2、域名的分类&#xff1a; 3、服务器的类型 二、DNS解析的过程 三、DNS的相关配置文件学习 1、本地主机有关的DNS文件学习 2、本地的DNS缓存服务器的文件 3、bind软件的相关配置文件&#xff1a; 4…

C语言 每日一题 牛客网 11.13 Day17

找零 Z国的货币系统包含面值1元、4元、16元、64元共计4种硬币&#xff0c;以及面值1024元的纸币。 现在小Y使用1024元的纸币购买了一件价值为N(0 < N≤1024)的商品&#xff0c;请问最少他会收到多少硬币&#xff1f; 思路 运用if语句进行判断分类 代码实现 int main() {…

Android Glide transform圆形图CircleCrop动态代码描边绘制外框线并rotateImage旋转,Kotlin

Android Glide transform圆形图CircleCrop动态代码描边绘制外框线并rotateImage旋转&#xff0c;Kotlin <?xml version"1.0" encoding"utf-8"?> <FrameLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:app&q…

基于SSM的校园预点餐系统

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

PayPal的CISO谈GenAI如何提高网络安全

在最近一个季度(2023财年第二季度)&#xff0c;PayPal报告收入为73亿美元&#xff0c;同比增长7%&#xff0c;5%的交易增长和37%的增值服务收入增长带来了强劲的季度业绩。截至2022年&#xff0c;PayPal的营收为275亿美元。 在进入PayPal之前&#xff0c;Keren创建了两家网络安…

leetCode 25.K 个一组翻转链表

给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。k 是一个正整数&#xff0c;它的值小于 或 等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值&a…

【优化版】DOSBox及常用汇编工具的详细安装教程

&#x1f308;个人主页&#xff1a;聆风吟 &#x1f525;系列专栏&#xff1a;网络奇遇记、图解数据结构 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 &#x1f4cb;前言一. dosbox的介绍、下载和安装1.1 dosbos简介1.2 dosbox的下载1.2.1 方式一&a…

AI工具-PPT-SlidesAI

SlidesAI 使用手册 https://tella.video/get-started-with-slidesai-tutorial-18yq 简介 SlidesAI 是一款快速创建演示文稿的AI工具&#xff0c;适用于无设计经验的用户。 开始使用 1. **安装与设置** - 访问 [SlidesAI官网](https://www.slidesai.io/zh)。 - 完成简单的设置…

【每日一题】区域和检索 - 数组可修改

文章目录 Tag题目来源解题思路方法一&#xff1a;分块方法二&#xff1a;线段树方法三&#xff1a;树状数组 写在最后 Tag 【树状数组】【线段树】【分块】【前缀和】【设计类】【2023-11-13】 题目来源 307. 区域和检索 - 数组可修改 解题思路 使用前缀和解决不行吗&#x…

【Git】第四篇:基本操作(理解工作区、暂存区、版本库)

Git 工作区、暂存区和版本库 工作区&#xff1a;就是我们创建的本地仓库所在的目录暂存区&#xff1a; stage或index&#xff0c;一般放在.git(可隐藏文件)目录下的index文件&#xff08;.git/index&#xff09;中&#xff0c;所以我们把暂存区有时候也叫做索引&#xff08;in…

DevChat:开发者专属的基于IDE插件化编程协助工具

DevChat&#xff1a;开发者专属的基于IDE插件化编程协助工具 一、DevChat 的介绍1.1 DevChat 简介1.2 DevChat 优势 二、DevChat 在 VSCode 上的使用2.1 安装 DevChat2.2 注册 DevChat2.3 使用 DevChat 三、DevChat 的实战四、总结 一、DevChat 的介绍 在AI浪潮的席卷下&#x…

不同优化器的应用

简单用用&#xff0c;优化器具体参考 深度学习中的优化器原理(SGD,SGDMomentum,Adagrad,RMSProp,Adam)_哔哩哔哩_bilibili 收藏版&#xff5c;史上最全机器学习优化器Optimizer汇总 - 知乎 (zhihu.com) import numpy as np import matplotlib.pyplot as plt import torch # …

北邮22级信通院数电:Verilog-FPGA(9)第九周实验(2)实现下降沿触发的JK触发器(带异步复位和置位功能)

北邮22信通一枚~ 跟随课程进度更新北邮信通院数字系统设计的笔记、代码和文章 持续关注作者 迎接数电实验学习~ 获取更多文章&#xff0c;请访问专栏&#xff1a; 北邮22级信通院数电实验_青山如墨雨如画的博客-CSDN博客 JK.v module JK (input clk,input J,input K,input…

在虚拟环境下安装python包

PyCharm可以自己给项目创建虚拟环境&#xff0c;示例如下&#xff1a; 首先通过File—>Setting—>Project&#xff1a;【项目名称】—>Project Interpreter—>设置—>add—>Virtuallenv Environment配置虚拟环境即可 添加解释器&#xff1a; 当创建虚拟环…

MATLAB Simulink和SMART PLC水箱液位高度PID控制(联合仿真)

SMART PLC 向导PID的详细介绍请查看下面文章链接: S7-200 SMART PLC PID向导详细介绍(如何实现P、PD、PID控制器)-CSDN博客文章浏览阅读1k次。这篇博客主要介绍SMART PLC PID向导的使用,PID控制相关的其它内容请查看专栏系列文章,常用链接如下:SMART PLC PID负压控制(过程…

python 使用pygame制作的打飞机小游戏

python基础使用pygame模块实现打飞机小游戏&#xff0c;有最高分记录&#xff0c;每次游戏的分数都会和最高分进行比较然后记录下来。 基础代码实现&#xff1a; class Bullet:def __init__(self):# 初始化成员变量&#xff0c;x&#xff0c;y&#xff0c;imageself.x 0self…