牛客编程巅峰赛S2第3场 - 青铜&白银&黄金 B 简单的公式

牛牛打怪

https://ac.nowcoder.com/acm/contest/9246/A

发现,看式子是个递推,所以是矩阵乘法。
图片说明

图片说明

class Solution {
public:
    typedef long long ll
    ll mod=1e9+7;
    struct nkl{
        ll d[3][3];
    };
    inline ll Get(ll n,ll x,ll y,ll xx,ll yy,ll zz){
        if(n==1) return x;
        if(n==2) return y;
        n-=2;
        nkl a;
        memset(a.d,0,sizeof(a.d));
        a.d[0][0]=xx,a.d[0][1]=yy;a.d[1][0]=zz;
        ll ans[10]={y,x};
        for (;n;n>>=1){
            if(n&1){
                ll op[10];
                memset(op,0,sizeof(op));
                for (int i=0;i<2;i++)
                    for (int j=0;j<2;j++)
                        op[i]=(op[i]+ans[j]*a.d[i][j]%mod)%mod;
                ans[0]=op[0],ans[1]=op[1];
            }
            nkl tmp;
            memset(tmp.d,0,sizeof(tmp.d));
            for (int i=0;i<2;i++)
                for (int j=0;j<2;j++)
                    for (int k=0;k<2;k++)
                        tmp.d[i][j]+=a.d[i][k]*a.d[k][j]%mod,tmp.d[i][j]%=mod;
            for (int i=0;i<2;i++)
                for (int j=0;j<2;j++)
                    a.d[i][j]=tmp.d[i][j];
        }
        return ans[0];
    }
    int Answerforcn(long long n) {
        ll x=Get(n,2,6,2,3,1);
        ll y=Get(n,7,35,3,10,1);
        int ans=(long long)(x*y%mod);
        return ans;
    }
};
全部评论
观察式子可以发现a[i]=2*3^(n-1),b[i]=7*5^(n-1) 不用矩乘
1 回复 分享
发布于 2020-11-24 21:38
大佬orz,在oeis网站上输入数列前几项,就有了a[n]=2*3^(n-1),b[n]=7*5^(n-1)
点赞 回复 分享
发布于 2020-11-24 21:53
强啊,大佬在哪学的呀,可以略微分享一下不
点赞 回复 分享
发布于 2020-11-24 23:57

相关推荐

点赞 评论 收藏
分享
评论
4
收藏
分享
牛客网
牛客企业服务