这个过了90的点,有什么坑?

#include <iostream>
using namespace std;
typedef unsigned long long ll;
const ll mod=1000000007;
 
const ll MOD=1000000007;
 
 
struct bt{
    ll a,b;
bt nxt()
{
    bt ans;
    ll xz;
    xz=(a+b)%(MOD-1);
    ans.a=b;
    ans.b=xz;
    return ans;
}
bt db()
{
    ll ansa,ansb;
    ll md=MOD-1;
    ansa=(a*a%md+b*b%md)%md;
    ansb=(2*a+b)%md*b%md;
    bt ans;
    ans.a=ansa;
    ans.b=ansb;
    return ans;
}
};
ll pw(ll a,ll x)
{
    if (x==0) return 1;
    ll ap=pw(a,x/2);
    if (x%2==1) return ap*ap%MOD*a%MOD;
        else return ap*ap%MOD;
}
bt fb(ll x)
{
    bt ans;
    ans.a=0;
    ans.b=1;
    if (x==1) return ans;
    bt ap=fb(x/2).db();
    if (x%2==0)
        return ap;
    else return ap.nxt();
}
ll a,b,c,n,q;
int main()
{
    cin>>q;
    cin>>a>>b;
    cin>>c>>n;
    if (q==1) {cout<<a%mod<<endl;return 0;}
    if (q==2) {cout<<b%mod<<endl;return 0;}
 
 
    c=pw(c%MOD,n);
    //cout<<q<<endl;
    ll ans1=fb(q-2).b;
    ll ans2=fb(q-1).b;
    ll ans3=(fb(q).b+mod-2)%(mod-1);
    //cout<<ans1<<' '<<ans2<<' '<<ans3<<endl;
    ll ans=pw(a%MOD,ans1)*pw(b%MOD,ans2)%MOD*pw(c,ans3)%MOD;
    cout<<ans<<endl;
}

全部评论
快速幂的时候,可能会有0的0次方,你的可能会输出1,出题人应该想输出0。 反正我是这么改过的。。。
点赞
送花
回复
分享
发布于 2020-02-05 19:39
快速幂的时候加一个判断n==0时输出0就过了.......
点赞
送花
回复
分享
发布于 2020-02-07 12:57
秋招专场
校招火热招聘中
官网直投

相关推荐

特斯联 后端开发 300 + 450餐补
点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务