Power oj 2818: 02和darling的约定

2818: 02和darling的约定
02和她的darling约定了要一直在一起,看遍这世界的所有风景。但是很不幸,这时候邪恶外星组织APE侵略了地球,地球危在旦夕。02为了守护和darling的约定,踏上了和APE战斗的道路。而darling却因为没有力量导致他无法和他心爱的02一起并肩作战。于是他来找博士帮忙,但是这个时候博士正在算一个问题,如果darling能够完成这个问题,那么博士将帮助他和02一起并肩作战。
现在博士扔出了这个问题,给你一个n代表一个长为n的数列,然后再给你数列的第一项a1,让你求出
在这里插入图片描述
并且规定

Input
第一行一个数T,代表有T组数据(1≤T≤104)
第二行到T+1行每行两个数,n和a1,表示一共有n项,第一项为a1 (1≤n≤106,1≤a1≤10e9+7)
Output
一共有t行,每行一个对应的答案,即为对于相应的n和a1,求出∏ni=1(ai+1)mod(109+7)的值

Sample Input
Raw
2
2 2
3610 13726





Sample Output
Raw
15
481591799

Hint
对于第一个输出,a1=2,a2=a1×a1=4,所以,∏ni=1(ai+1)mod(109+7)=(2+1)×(4+1)mod(109+7)=15


解题思路


这是一个数论的题
在这里插入图片描述
其实展开后就是一个等比数列,第一项为1,公比为a1,长度为2的n次方。
求和公式:
在这里插入图片描述
需要使用欧拉降幂和费马小定理求逆元,下面给出代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
typedef long long LL;
const int mod=1000000007;
LL ksm(LL a,LL b,LL m){//快速幂需要使用long long
    LL ans=1;
    while(b>0){
        if(b%2){
            ans=ans*a%m;
        }
        a=a*a%m;
        b>>=1;
    }
    return ans;
}

int main()
{
    LL x,y;
    int t;
    scanf("%d",&t);
    while(t--){
        scanf("%lld%lld",&x,&y);
        if(y==1)
            printf("%lld\n",ksm(2,x,mod));//特判一下y==1的情况
        else{
            LL n=ksm(2,x,mod-1);
            LL ans=ksm(y-1,mod-2,mod);
            LL fm=(ksm(y,n+mod-1,mod)-1+mod)%mod;//得到一个正数
            LL cnt=ans*fm%mod;
            printf("%lld\n",cnt);
        }
    }
    return 0;
}
发布了36 篇原创文章 · 获赞 10 · 访问量 1933

猜你喜欢

转载自blog.csdn.net/weixin_44003265/article/details/96483881
今日推荐