快速幂算法详解和一道例题

   好长时间都不更博客了,今天给大家带来的是快速幂算法

    快速幂算法顾名思义就是快速的实现幂运算,我知道一定会有人说为什么要用快速幂算法去实现幂运算呢?

   c里面的pow函数不能用吗?

   对于很小的幂运算当然可以了,但如果是一个底数和指数都很大的呢?很显然pow函数就不够用了。

  不多赘述,先看代码吧!

  

# include <bits/stdc++.h>
using namespace std;
int p(int a,int b)
   {
    int ans=1;
    while(b!=0)  //b!=0就继续去循环 
    {
     if(b&1!=0) //就是b的最后一位如果是1,就让ans=ans*a,二进制的&运算,搞搞清楚 
	  ans=ans*a;  
    a*=a;      //这里每一次a都变成a的平方,因为本身二进制做指数就会变成其平方倍  
    b=b>>1;   //二进制往前取一位 
	}
    return ans;
  }
int main ()
{
	int x=p(3,11);
	printf ("%d\n",x); 
	return 0;
}
/*
b是指数,a是底数 
快速幂其实就是用二进制的方法去进行幂运算
如果还有疑问的话,就把11对应的二进制 1011 写出来,自己对着程序去推推看。 
*/ 

看懂上面的代码,就来练一练手吧!

有一天集训队的学弟们正在计算一堆数,但是dreamstart感觉他们算的太慢了,就让他们坐在一起想出一个快速计算的方法,但是由于他们一时想不出来,想让你帮助他们。他们说现在有一个数列,要算出第 i 个数的 i 次幂并且把每个数计算出来的值加到一起,最后答案模10000019。

聪明的你可以帮助他们吗?

输入描述:

第一行有一个整数n,n <= 1e5

接下来一行有n个数,每个数的大小不超过1e16

输出描述:

输出取模之后的和

示例1

输入

复制

4
1 6 9 12

输出

复制

21502

来源于:牛客网

# include <bits/stdc++.h>
using namespace std;
long long f (long long a,int b)
{
	long long s=1;
	while (b!=0)
	{
		if (b&1!=0)
		  s=s*a%10000019;
		a=a*a%10000019;
		b=b>>1;
	}
	return s;
}
int main ()
{
	int n;
	long long ans=0;
	scanf ("%d",&n);
	for (int i=1;i<=n;++i)
	   {
	   	 long long  s;
	   	 scanf ("%lld",&s);
	   	 long long t=f(s,i);
	   	  ans=ans+t;
	   }
	printf ("%lld\n",ans%10000019);
	return 0;
 } 
 /* 题目要求取模,把有可能超精度的地方都取模,以防万一
 */ 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值