【快速幂】

【快速幂】
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。

扫描二维码关注公众号,回复: 5507684 查看本文章

输入:
第一行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;
}

快速幂只是一种做题的方法,可能并不会直接快速幂,有些题目是很直接的,但也有一些是模糊的,得靠自己真正领悟得到

还有一道题:

问题 A: 【快速幂】序列的第k个数题目链接:

题目描述:
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;
}

类似的题目还有很多,就不一一解释了,总之就这么个思路,加油!

猜你喜欢

转载自blog.csdn.net/qq_43916260/article/details/87645753