湖南大学ACM——10388.高级模运算(二分幂求解)

在这里插入图片描述根据输入的数字,进行次方运算并加和。

题目分析

这道题不难,相信很多朋友都能马上做出来,只需要按照函数的次方函数pow()即可解决,但是里有一坑,就是数组溢出的问题。我们每次都做pow(A,B)的运算很有可能造成溢出,那应该如何更好地求幂运算呢?
我们想到了一个经典的方法:二分幂!
遇到求幂运算容易溢出的问题应该快速想到二分幂和快速幂或者矩阵幂
二分幂的思路很简单:

long long binpow(long long x,long long y)
{
	long long ans = 1:
	while(y!=0)
	{
		if(y % 2 == 1)
			ans = ans * x; //下文代码中我会在这里直接%需要取模的数字,可以减少代码量
		y /= 2;
		x = x * x;
	}
	return ans;

如果指数是一个偶数,那么我们每次都将x自身进行平方即可,然后将y不断除以2,相当于自身求了平方,就可以在y上减小一定的数值,最后y一定会到1,然后将ans与x相乘即可得到最终的结果,
这个方法不想无脑进行累乘,而是通过不断分开为平方的y/2次方,

代码

#include<iostream>
using namespace std;
int m,h;
long long A,B,res=0;
long long binPow(long long x,long long y)
{//ab=a2^b0+2^b1+¡­+2^bk=a2^b0¡Áa2^b1¡Áa2^bk
    long long ans=1;
    while(y!=0)
    {
        if(y%2==1)
            ans=ans*x%m;
        y/=2;
        x=x*x%m;
    }
    return ans;
}
int main()
{
    cin>>m>>h;
    for(int i=0;i<h;i++)
    {
        cin>>A>>B;
        res+=binPow(A,B);
    }
    cout<<res%m<<endl;
    return 0;
}
发布了60 篇原创文章 · 获赞 2 · 访问量 1070

猜你喜欢

转载自blog.csdn.net/weixin_44755413/article/details/105461547