快速幂介绍+快速幂板子题。c++

为什么要用快速幂?

思考a的n次方需要进行多少次运算?

最简单的算法就是进行n-1次乘法运算,时间复杂度是O(n)。

如果采用分而治之的策略,时间复杂度是O(log2n)。
以261的计算为例:

一共需要9次乘法运算,而常规做法需要60次乘法运算。

快速幂怎么实现?
根据上面的分治我们可以知道:
分治到某一步需要求解ax,当x是偶数的时候直接返回ax/2 ×a x/2 。当x是奇数的时候返回ax/2×ax/2×a。边界是x=0时返回1。

long long quick_pow(long long a,long long b)
{
	if(b==0)return 1;
	long long temp=quick_pow(a,b/2);
	if(x%2==0)
	return temp*temp;
	else
	return temp*temp*a;
}//当然,不用递归也可以用迭代

给出3个正整数A B C,求A^B Mod C。

输入3个正整数A B C,中间用空格分隔。(1 <= A,B,C <= 10^9),输出计算结果。

sample input:
3 5 8

sample output:
3

#include<iostream>
#include<string>
using namespace std;
long long quickpow(long long a,long long b,long long c)
{
	long long ans=1;
	a=a%c;
	while(b>0)
	{
		if(b%2==1)//奇数幂
		{
			ans=ans*a;
			ans=ans%c;
			b--;
		 } 
		b/=2;
		a=(a*a)%c;
	}
	return ans;
}
int main()
{
	long long a,b,c;
	cin>>a>>b>>c;
	long long ans;
	ans=quickpow(a,b,c);
	cout<<ans<<endl;
	return 0;
}

这里需要注意的是,虽然a,b,c<=10^9,可以用int 定义,但是在运算中ans和a可能会超范围,所以统一使用long long。这个题直接计算复杂度过高,所以一定要引入快速幂运算。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是RK3588板子使用MPP进行H.264编码的示例C++代码: ```c++ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <fcntl.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/mman.h> #include <errno.h> #include "rk_mpi.h" #include "rk_venc.h" #define MAX_FILE_PATH_SIZE 256 #define MAX_FRAME_BUF_SIZE (1920*1080*3/2) int main(int argc, char** argv) { // 初始化MPP模块 RK_MPI_SYS_Init(); // 打开输入文件 char input_path[MAX_FILE_PATH_SIZE] = "/path/to/input.yuv"; int input_fd = open(input_path, O_RDONLY); if (input_fd < 0) { printf("Failed to open input file %s: %s\n", input_path, strerror(errno)); return -1; } // 打开输出文件 char output_path[MAX_FILE_PATH_SIZE] = "/path/to/output.h264"; int output_fd = open(output_path, O_WRONLY | O_CREAT | O_TRUNC, 0666); if (output_fd < 0) { printf("Failed to open output file %s: %s\n", output_path, strerror(errno)); close(input_fd); return -1; } // 获取输入文件大小 struct stat input_stat; fstat(input_fd, &input_stat); int input_size = input_stat.st_size; // 映射输入文件到内存 unsigned char* input_buf = (unsigned char*) mmap(NULL, input_size, PROT_READ, MAP_SHARED, input_fd, 0); if (input_buf == MAP_FAILED) { printf("Failed to mmap input file: %s\n", strerror(errno)); close(input_fd); close(output_fd); return -1; } // 初始化编码参数 MPP_ENC_CFG cfg; memset(&cfg, 0, sizeof(cfg)); cfg.frm_cfg.width = 1920; cfg.frm_cfg.height = 1080; cfg.frm_cfg.fmt = MPP_FMT_YUV420SP; cfg.rc_mode = MPP_ENC_RC_MODE_CBR; cfg.bps_target = 2000000; cfg.fps_in = 25; cfg.fps_out = 25; cfg.gop = 50; cfg.profile = 100; // 创建编码器 MPP_ENC_CTX* enc_ctx = NULL; RK_MPI_VENC_CreateContext(&enc_ctx, RK_ID_VENC_H264); RK_MPI_VENC_RegisterCallback(enc_ctx, NULL, NULL); // 配置编码器参数 RK_MPI_VENC_SetConfig(enc_ctx, RK_MPI_VENC_CFG_BASE, &cfg, sizeof(cfg)); RK_MPI_VENC_StartRecvPic(enc_ctx); // 编码每一帧 unsigned char* frame_buf = (unsigned char*) malloc(MAX_FRAME_BUF_SIZE); int frame_size = 1920*1080*3/2; int frame_cnt = input_size / frame_size; for (int i = 0; i < frame_cnt; i++) { // 从输入文件读取一帧数据 unsigned char* input_frame = input_buf + i * frame_size; // 填充MPP编码器的输入数据 MPP_ENC_DATA enc_data; memset(&enc_data, 0, sizeof(enc_data)); enc_data.pbuf = input_frame; enc_data.buf_size = frame_size; enc_data.time_stamp = i * 40; enc_data.eos = (i == frame_cnt - 1); // 编码一帧数据 RK_MPI_VENC_SendFrame(enc_ctx, &enc_data); // 获取编码后的数据 MPP_ENC_DATA pkt; memset(&pkt, 0, sizeof(pkt)); int ret = RK_MPI_VENC_GetStream(enc_ctx, &pkt, RK_TRUE); if (ret == RK_SUCCESS) { // 将编码后的数据写入输出文件 write(output_fd, pkt.pbuf, pkt.buf_size); RK_MPI_VENC_ReleaseStream(enc_ctx, &pkt); } } // 销毁编码器 RK_MPI_VENC_StopRecvPic(enc_ctx); RK_MPI_VENC_DestroyContext(enc_ctx); // 释放内存映射和资源 munmap(input_buf, input_size); close(input_fd); close(output_fd); return 0; } ``` 需要注意的是,上述代码仅供参考,实际使用时可能需要根据具体的需求和参数进行适当的修改。同时,还需要确保MPP已经正确安装并且编码标准和参数设置正确。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值