这个过了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;
}

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

相关推荐

点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务