【快速幂】
1.用于解决数据过大的题目
2.对某一数据的不断取模可以用到快速幂
3.要理解对数据的取模(mod)
心得:我认为快速幂就是一种解题的方法,不要想复杂了,快速幂也不是很难理解,这只不过就给我们提供解题思路,只要能把模板牢记于心,就能对快速幂掌握于心,灵活运用了。
下面附一快速幂道题目:
题目链接:问题A:【快速幂】a^b
题目描述:
求 a 的 b 次方对 p 取模的值,其中 1≤a,b,p≤109
输入三个用空格隔开的整数a,b和p。
输出一个整数,表示ab mod p的值。
样例输入
2 3 9
样例输出
8
参考代码:
#include<stdio.h>
int main()
{
long long int a,b,p,i,j,k;
scanf("%lld%lld%lld",&a,&b,&p);
k=1;
while(b)
{
if(b%2==1)
k=(k*a)%p;
a=(a*a)%p;
b/=2;
}
k=k%p;
printf("%lld\n",k);
return 0;
}
问题 B: 64位整数乘法
题目链接:问题 B: 64位整数乘法
题目描述:
求 a 乘 b 对 p 取模的值,其中 1≤a,b,p≤10^18。
输入:
第一行a,第二行b,第三行p。
输出:
一个整数,表示a*b mod p的值。
样例输入:
2
3
9
样例输出:
6
这题也不多解释了,直接上代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
typedef long long ll;
int main()
{
char a[100];
ll b,p;
scanf("%s%lld%lld",a,&b,&p);
int x;
ll sum=0;
x=strlen(a);
for(int i=0;i<x;i++)
sum=(10*sum%p+(a[i]-'0')%p*b%p)%p;
printf("%lld\n",sum);
return 0;
}
快速幂只是一种做题的方法,可能并不会直接快速幂,有些题目是很直接的,但也有一些是模糊的,得靠自己真正领悟得到
还有一道题:
题目描述:
BSNY在学等差数列和等比数列,当已知前三项时,就可以知道是等差数列还是等比数列。现在给你序列的前三项,这个序列要么是等差序列,要么是等比序列,你能求出第k项的值吗?如果第k项的值太大,对其取模200907。
输入:
第一行一个整数T(1≤T≤100),表示有T组测试用例。
接下来每行表示一组测试数据,对于每组测试数据,输入前三项a,b,c,然后输入k。(1≤a≤b≤c≤109,0≤k≤109)
输出:
对于每组测试用例,输出第k项取模200907的值。
样例输入:
2
1 2 3 5
1 2 4 5
样例输出:
5
16
参考代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
typedef long long ll;
ll p=200907;
ll pown(ll a,ll b)
{
ll k=1;
while(b)
{
if(b%2==1)
k=(k*a)%p;
a=(a*a)%p;
b/=2;
}
k=k%p;
return k;
}
int main()
{
ll t;
scanf("%lld",&t);
while(t--)
{
ll a,b,c,n;
scanf("%lld%lld%lld%lld",&a,&b,&c,&n);
ll sum,d;
if(b*2==a+c)
{
d=(b%p-a%p)%p;
sum=(a%p+(n-1)%p*d%p)%p;
}
else
{
d=(b/a);
sum=(a%p*pown(d,n-1))%p;
}
printf("%lld\n",sum);
}
return 0;
}
类似的题目还有很多,就不一一解释了,总之就这么个思路,加油!