其他分享
首页 > 其他分享> > 多校联训12

多校联训12

作者:互联网

rank 56 grade 146

T1:水题二分

T2:数论

T2:定义f(f(f(f(x)))).....是f(x)迭代n次的结果,f(x)=(x+1/x)/2.给出多组n,x,求f(x)这样迭代n-1的结果。(n<=1e18,x<=1e18)

x= \(\frac{a}{b}\) ,原式可以化为\(\frac{a^{2}+b^{2}}{2*ab}\),假设f2(x)=a2/b2,发现a2+b2=\((a+b)^{2}\),a2-b2=\((a-b)^{2}\),那么就可以得到fn(x)=an/bn,an+bn=\((a+b)^{2^{n-1}}\),an-bn=\((a-b)^{2^{n-1}}\),可以用快速幂解决。注意在计算指数的时候,是qpow(2,n-1,mod-1)模数是mod-1,因为,当gcd(a,p)=1,有\(a^{b}\equiv\) $ a^{b mod phi(p)}$(mod p),又因为p是质数,所以phi(p)=p-1,所以mod (p-1)

const ll mod=1e9+7,n2=500000004;
ll x,n;
inline ll qpow(ll a,ll b,ll md){
    ll ans=1;
    //b%=md;
    while(b){
        if(b&1){
            ans=ans*a%md;
        }
        b>>=1;
        a=a*a%md;
    }
    return ans;
}
int main()
{
    //freopen("c.out","w",stdout);
    int T=re();
    while(T--){
        x=re(),n=re();
        ll a=x,b=1;ll aa=x,bb=1;n=qpow(2,n-1,mod-1);
        a=qpow(aa+bb,n,mod);b=qpow(aa-bb,n,mod);
      //  chu("a:%lld b:%lld\n",a,b);
        ll fz=(a+b)*n2%mod,fm=(fz-b+mod)%mod;
        //chu("fz:%lld fm:%lld\n",fz,fm);
        chu("%lld\n",fz*qpow(fm,mod-2,mod)%mod);
    }
	return 0;
}

标签:qpow,12,ll,多校,联训,ans,lld,fz,mod
来源: https://www.cnblogs.com/403caorong/p/16583390.html