【蓝桥每日一题]-快速幂,倍增,滑动窗口(保姆级教程 篇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的范围,额,别想着暴力了。

      

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

      

然后我们用快速幂来处理要跳的次数(就是一次执行多次)

       

#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.mfbz.cn/a/133409.html

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

相关文章

如何知道一个程序为哪些信号注册了哪些信号处理函数?

https://unix.stackexchange.com/questions/379694/is-there-a-way-to-know-if-signals-are-present-in-your-application-and-which-sign 使用 strace

数据结构与算法【二分查找】Java实现

需求&#xff1a;在有序数组 A 内&#xff0c;查找值target 如果找到返回索引如果找不到返回 -1 前提 给定一个内含 n 个元素的有序数组 A&#xff0c;一个待查值 target 1 设置 i0&#xff0c;jn-1 2 如果 i \gt j&#xff0c;结束查找&#xff0c;没找到 3 设置 m (…

只会CRUD程序员朋友,你开始拥抱云计算技术了吗

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概6000多字&#xff0c;预计阅读时间长需要6分钟。本篇文章的理论性较强&#xff0c;是一篇质量分数较高的技术文章&#xff0c;建议收藏…

STM32F407的看门狗

文章目录 看门狗时钟两种看门狗IWDG结构图作用 寄存器IWDG_KR键值寄存器IWDG_PR预分频寄存器2-0 PR预分频器系数 IWDG_RLR重装载寄存器IWDG_SR状态寄存器1RVU 重载值更新0 PVU 预分频值更新注意 写保护超时时间使用步骤取消寄存器 写保护设置预分频系数和重装载值看门狗溢出时间…

阿里云服务器搭建sql 服务

阿里云搭建mysql服务 环境准备 系统镜像 ubuntu 如果买点的实例不是ubuntu 系统镜像&#xff0c;需要停止服务之后&#xff0c;更改镜像 更新 apt-get &#xff1a; 更新apt-get: sudo apt-get update 如果没有出现&#xff1a;apt-get 找不到此命令的错误&#xff0c;可能是…

【教3妹学编程-算法题】2923. 找到冠军 I

3妹&#xff1a;2哥2哥&#xff0c;你看到新闻了吗&#xff1f;襄阳健桥医院院长 公然“贩卖出生证明”&#xff0c; 真是太胆大包天了吧。 2哥 : 我也看到新闻了&#xff0c;7人被采取刑事强制措施。 就应该好好查查他们&#xff0c; 一查到底&#xff01; 3妹&#xff1a;真的…

箱线图(boxplot)

箱线图 boxplot 简述原理绘制方法python - matplotlib加载功能模块加载数据绘制boxplot python - seaborn加载功能模块加载数据绘制boxplot R - ggplot加载功能模块加载数据绘制boxplot 简述 因图形形状如箱子而得名。箱线图常用于展示一组连续型数据的分散情况。学术界普遍认…

SQL SERVER Inregration Services-OLE DB、Oracle和ODBC操作

OLE DB链接器 OLE DB插件下载&#xff1a;https://learn.microsoft.com/zh-cn/sql/connect/oledb/download-oledb-driver-for-sql-server?viewsql-server-ver16 配置OLE DB Connection Manager 在点击“新建”时&#xff0c;会弹出警告信息“不支持指定的提供程序&#xff0…

文件夹批量改名技巧:简单步骤,实现文件夹随机重命名

在日常生活和工作中&#xff0c;经常需要处理大量的文件夹&#xff0c;需要对其进行有效的管理。在这些情况下&#xff0c;文件夹的命名就变得非常重要。一个好的命名策略可以快速找到所需的文件夹&#xff0c;也可以帮助更好地组织文件。然而&#xff0c;手动为每个文件夹重命…

研究方法——案例研究设计与方法

作者&#xff1a;罗伯特K.殷 &#xff08;一&#xff09;计划&#xff1a;如何把握何处、何时用案例研究方法 1.问题&#xff1a; 按照作者的观点&#xff0c;案例研究1984年之后才逐渐得到重视&#xff0c;可是在数据信息有效收集的时代&#xff0c;几乎所有的经典都是以案例…

电路中模拟地和数字地的分割方法

电路中只要是地&#xff0c;最终都要接到一起&#xff0c;然后入大地。如果不接在一起就是“浮地”&#xff0c;存在压差&#xff0c;容易积累电荷&#xff0c;造成静电。 地是参考0电位&#xff0c;所有电压都是参考地得出的&#xff0c;地的标准一致&#xff0c;故各种地应短…

计蒜客详解合集(3)期

目录 T1236——分苹果 T1113——整理药名 T1153——整数奇偶排列 T1249——漂亮的字符串 T1168——统计素数个数 T1160——甲流病人筛选 T1236——分苹果 分享一道特别简单的题。 蒜头君要把一堆苹果分给 个小朋友&#xff0c;要使每个人都能拿到苹果&#xff0c;而目每…

搞怪python代码

微信消息重发代码&#xff1a; from pynput.keyboard import Key,Controller import time keyboard Controller()a input("请输入你需要循环输出的内容&#xff1a;") b eval(input(请输入你想要循环的次数&#xff1a;)) print("数据已接收&#xff01;请将…

一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

目录 1解题思路&#xff1a; 2代码如下&#xff1a; 3运行结果&#xff1a; 4总结&#xff1a; 5介绍&#xff1a; 1解题思路&#xff1a; 利用循环&#xff08;穷举法&#xff09;来 对 所 需要的数 进行确定 2代码如下&#xff1a; #include <stdio.h>int main() …

【Python大数据笔记_day06_Hive】

hive内外表操作 建表语法 create [external] table [if not exists] 表名(字段名 字段类型 , 字段名 字段类型 , ... ) [partitioned by (分区字段名 分区字段类型)] # 分区表固定格式 [clustered by (分桶字段名) into 桶个数 buckets] # 分桶表固定格式 注意: 可以排序[so…

Java中的多态究竟是什么?

目录 一.概念二.使用条件三.重写1.概念2.使用条件3.与重载对比4.举例5.为什么需要重写1.重写规则 2.静态绑定--重载3.动态绑定--重写 四.向上转型第一种传参方式&#xff1a;直接赋值第二种传参方式&#xff1a;通过传参优缺点 五.向下转型举例缺点 六.多态的优缺点优点缺点 一…

ros1 基础学习08- 实现Server端自定义四 Topic模式控制海龟运动

一、服务模型 Server端本身是进行模拟海龟运动的命令端&#xff0c;它的实现是通过给海龟发送速度&#xff08;Twist&#xff09;的指令&#xff0c;来控制海龟运动&#xff08;本身通过Topic实现&#xff09;。 Client端相当于海龟运动的开关&#xff0c;其发布Request来控制…

Leetcode2833. 距离原点最远的点

Every day a Leetcode 题目来源&#xff1a;2833. 距离原点最远的点 解法1&#xff1a;贪心 要使得到达的距离原点最远的点&#xff0c;就看 left 和 right 谁大&#xff0c;将 left 和 right 作为矢量相加&#xff0c;再往同方向加上 underline。 答案即为 abs(left - rig…

vue-入门介绍

​&#x1f308;个人主页&#xff1a;前端青山 &#x1f525;系列专栏&#xff1a;Vue篇 &#x1f516;人终将被年少不可得之物困其一生 依旧青山,本期给大家带来vue篇专栏内容,初识vue入门到项目实战详解 目录 一.Vue介绍 二.初识Vue 工具安装 创建项目 目录结构介绍 项…

Adobe premiere裁剪视频尺寸并转为GIF格式

第一步&#xff1a;裁剪视频 修改序列设置以适应裁剪之后的图像区域&#xff1b;序列中的编辑模式不能使用默认的&#xff0c;这里使用的是“DNxHR_2K” 第二步&#xff1a;导出设置
最新文章