#41. 果实计数(快速幂)

本文介绍了一种高效计算b的n次幂模k值的方法——快速幂算法,并通过具体实例展示了算法的应用过程。适用于解决计算机科学中涉及大数运算的问题。

【题目描述】:

淘淘家有棵奇怪的苹果树,这棵树共有n+1层,标号为0~n。这棵树第0层只有一个节点,为根节点。已知这棵树为b叉树,且保证是一颗满b叉树。

现在,该树第n层的每个节点上都结出了一个苹果,淘淘想知道共结了多少苹果。由于数量可能很大,答案要求输出mod k后的结果。

【输入描述】:

给出第1层的节点数b和层数n和k

【输出描述】:

输出苹果数mod k后的结果。

【样例输入】:

2 10 9

【样例输出】:

7

【时间限制、数据范围及描述】:

时间:1s 空间:32M

30%的数据保证:b<=100,n<=10, k<=100.

 

100%的数据保证:b<2^31,n<2^31,k<=2^15.

 

本题说是一颗树,其实就是求b的n次幂模k的值。运用到了快速幂,就是不使用暴力算法,而采取分段计算的思想。

 

1.如果b是偶数,我们可以记k = a2 mod c,那么求(k)b/2 mod c就可以了。

 

2.如果b是奇数,我们也可以记k = a2 mod c,那么求((k)b/2 mod c × a ) mod c =((k)b/2 mod c * a) mod c 就可以了

 

以下是代码:

 

#include<stdio.h>
#include<iostream>

using namespace std;
long long ans;

long long read()//快速读入(好像没有必要)
{
	char c;
	long long ans=0,f=1;
	c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-')
		{
			f=-1;
		}
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		ans=ans*10+c-'0';
		c=getchar();
	}
	return ans*f;
}

void work(long long b,long long n,long long k)//快速幂
{
	ans=1;
	while(n!=0)
	{
		if(n&1)
	    ans=ans*b%k;
	    b=b*b%k;
	    n=n/2;
	}
	return ;
}
int main()
{
	long long b=0,n=0,k=0;
	b=read();
	n=read();
	k=read();
	work(b,n,k);
	printf("%lld",ans);
	return 0;
} 

简化之后的模板,更加易懂的可以写成:

int PowerMod(int a, int b, int c)

  
{

        int ans = 1;

        a = a % c;

        while(b > 0)

            {

              if(b % 2 = = 1)

                  ans = (ans * a) % c;

               b = b / 2;

              a = (a * a) % c;

            
    }

      return ans;

      
}

 

 

### 三、树上果实检测与计数实现方法 #### 3.1 图像预处理 在使用OpenCV进行果实检测之前,需要对图像进行预处理以提高检测的准确性。常见的预处理步骤包括灰度化、高斯模糊、颜色空间转换等。 ```python import cv2 import numpy as np # 读取图像 image = cv2.imread(&#39;fruit_image.jpg&#39;) # 转换为灰度图像 gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 高斯模糊,减少噪声 blurred = cv2.GaussianBlur(gray, (5, 5), 0) ``` #### 3.2 果实检测 果实检测可以通过颜色阈值分割来实现。例如,在HSV颜色空间中,可以根据果实的颜色特征设置阈值来提取果实区域。 ```python # 转换到HSV颜色空间 hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV) # 定义颜色范围,这里以红色为例 lower_red = np.array([0, 120, 70]) upper_red = np.array([10, 255, 255]) # 创建掩膜 mask = cv2.inRange(hsv, lower_red, upper_red) # 形态学操作,去除小的噪声点 mask = cv2.erode(mask, None, iterations=2) mask = cv2.dilate(mask, None, iterations=2) ``` #### 3.3 果实轮廓检测与计数 通过查找轮廓并过滤掉不符合条件的小轮廓,可以实现果实计数。 ```python # 查找轮廓 contours, _ = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 初始化计数器 count = 0 # 遍历所有轮廓 for cnt in contours: # 计算轮廓面积 area = cv2.contourArea(cnt) # 过滤掉小面积轮廓 if area > 100: count += 1 # 绘制轮廓 cv2.drawContours(image, [cnt], -1, (0, 255, 0), 2) # 显示结果 cv2.putText(image, f&#39;Count: {count}&#39;, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2) cv2.imshow(&#39;Fruit Count&#39;, image) cv2.waitKey(0) cv2.destroyAllWindows() ``` #### 3.4 区域限制检测 为了进一步提高检测的准确性,可以设置一个感兴趣的区域(ROI),只在这个区域内进行果实检测和计数。 ```python # 设置ROI区域 roi_points = [(100, 100), (600, 100), (600, 400), (100, 400)] # 在可视化时添加 cv2.polylines(image, [np.array(roi_points)], True, (0, 0, 255), 2) # 提取ROI区域 roi_mask = np.zeros_like(gray) cv2.fillPoly(roi_mask, [np.array(roi_points)], 255) masked_image = cv2.bitwise_and(mask, roi_mask) # 再次查找轮廓 contours, _ = cv2.findContours(masked_image.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 更新计数器 count = 0 # 遍历所有轮廓 for cnt in contours: # 计算轮廓面积 area = cv2.contourArea(cnt) # 过滤掉小面积轮廓 if area > 100: count += 1 # 绘制轮廓 cv2.drawContours(image, [cnt], -1, (0, 255, 0), 2) # 显示结果 cv2.putText(image, f&#39;Count: {count}&#39;, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 0), 2) cv2.imshow(&#39;Fruit Count with ROI&#39;, image) cv2.waitKey(0) cv2.destroyAllWindows() ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值