好长时间都不更博客了,今天给大家带来的是快速幂算法
快速幂算法顾名思义就是快速的实现幂运算,我知道一定会有人说为什么要用快速幂算法去实现幂运算呢?
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;
}
/* 题目要求取模,把有可能超精度的地方都取模,以防万一
*/