HDU-5793-A Boring Question-打表找规律加模逆元

来源:互联网 发布:添加URL端口 编辑:程序博客网 时间:2024/06/03 23:53

题意:根据题目所给公式打表找规律,容易发现

f(n,m)=m*f(n-1)+1

f(1,m)=m+1

容易得到

f(n,m)=(m^(n+1)-1)/(m+1)

套一个模逆元板子就好了

#include<bits/stdc++.h>#define mod 1000000007using namespace std;long long extend_gcd(long long a,long long b,long long &x,long long &y){    if(a==0&&b==0) return -1;    if(b==0){x=1;y=0;return a;}    long long d=extend_gcd(b,a%b,y,x);    y-=a/b*x;    return d;}long long mod_rev(long long a,long long n){    long long x,y;    long long d=extend_gcd(a,n,x,y);    if(d==1) return (x%n+n)%n;    else return -1;}long long qpow(long long x,long long y) {    long long ans=1;    long long tt=x;    while(y) {        if(y&1) {            ans*=tt;            ans%=mod;        }        tt*=tt;        tt%=mod;        y/=2;    }    return ans;}int main(){    long long n,m;    int t;    scanf("%d",&t);    while(t--) {        scanf("%lld%lld",&n,&m);        long long a=qpow(m,n+1);        a=(a-1+mod)%mod;       // cout <<"=="<< a << endl;        long long ans=a*mod_rev(m-1,mod)%mod;        printf("%lld\n",ans);    }    return 0;}


0 0