HDU 5793 A Boring Question(快速幂+求逆元)

来源:互联网 发布:淘宝网婴幼儿童车 编辑:程序博客网 时间:2024/05/22 21:32

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5793

这道题就是给你一个公式,然后再给数据范围给你,然后求答案。

这道题的公式推到最后就是一个等比数列的求和公式,也就是说,输入n和m,然后从m的0次方一直加到n次方的和就是答案。

但是由于这道题的数据太大了,有1e9,所以我们不可能用for循环一直加到最后,所以根据公式,我们需要用到快速幂来求m^n。用快速幂求出来之后,我们根据等比数列的求和公式,就成了(1-m^n)/(1-m)%mod。因为还要对1e9+7取模,所以mod=1e9+7。但是因为要取模,所以直接当做除法来做会出错,所以,要把(1-m)和mod的逆元求出来,当做乘法来做。所以求逆元,其实就是求倒数。所以(1-m)和mod就是其倒数。

#include<stdio.h>#include<iostream>#include<string.h>#include<math.h>#include<algorithm>#include<vector>#include<string>#include<queue>#include<map>#define ll long long#define maxn 50010const int mod=1e9+7;using namespace std;int T;ll n,m;ll X,y;ll mi(ll x, ll a, int p){    ll ans=1;    x=x%p;    while(a>0)    {        if(a&1)        ans=(ans*x)%p;        x=(x*x)%p;        a>>=1;    }    return ans;}ll gcd(ll a,ll b)  {      int t,d;      if(b==0)      {          X=1;          y=0;             return a;      }      d=gcd(b,a%b);      t=X;      X=y;      y=t-(a/b)*y;        return d;}   int main(){    scanf("%d",&T);    while(T--)    {        scanf("%lld %lld",&n,&m);        gcd(m-1,mod);        if(X<0)  X+=mod;        ll ans=(mi(m,n+1,mod)-1)*X%mod;        printf("%lld\n",ans);    }    return 0;}
0 0
原创粉丝点击