• HDU2842—Chinese Rings


    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2842

    题目意思:一把一个n连环的前n个拿下来,一个个n连环,要把第k个拿下来,需要把前n-2个拿下来,并留下第n-1个环,然后花一步把第n个拿下来,然后为了把第n-1个环拿下来,我们又需要把前n-2个放回去(逆过程),从而把这个问题转化成把前n-1个环拿下来。

    思路:根据上面的分析,我们很容易的可以写出递推式子,f[n]=2*f[n-2]+f[n-1]+1,一个带常数项的矩阵快速幂,题目意思有点难懂,忽略了,要把前n-2个放回去,还是逆过程,一直没有搞得特别懂,感觉有点没道理。

    代码:

    //Author: xiaowuga
    #include <bits/stdc++.h>
    #define maxx INT_MAX
    #define minn INT_MIN
    #define inf 0x3f3f3f3f
    #define n 3
    #define MOD 200907
    using namespace std;
    typedef long long ll;
    struct Matrix{
        ll mat[3][3];
        Matrix operator * (const Matrix & m) const{
            Matrix tmp;
            for(int i=0;i<n;i++)
                for(int j=0;j<n;j++){
                    tmp.mat[i][j]=0;
                    for(int k=0;k<n;k++){
                        tmp.mat[i][j]+=mat[i][k]*m.mat[k][j]%MOD;
                        tmp.mat[i][j]%=MOD;
                    }
                }
            return tmp;
        }
    };
    Matrix POW(Matrix m,ll k){
        Matrix ans;
        memset(ans.mat,0,sizeof(ans.mat));
        for(int i=0;i<n;i++) ans.mat[i][i]=1;
        while(k){
            if(k&1) ans=ans*m;
            k/=2;
            m=m*m;
        }
        return ans;
    }
    int main() {
        ios::sync_with_stdio(false);cin.tie(0);
        ll num;
        while(cin>>num&&num){
            Matrix m;
            memset(m.mat,0,sizeof(m.mat));
            m.mat[0][0]= m.mat[0][2]= m.mat[1][0]= m.mat[2][2]=1;
            m.mat[0][1]=2;
            ll f[3]={2,1,1};
            Matrix ans;
            if(num<=2) cout<<(num==2?2:1)<<endl;
            else{
                ans=POW(m,num-2);
                ll sum=0;
                for(int i=0;i<n;i++){
                    sum+=ans.mat[0][i]*f[i]%MOD;
                }
                cout<<sum%MOD<<endl;
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    测试脚本
    浅谈优化SQLServer数据库服务器内存配置的策略
    真正的取真实IP地址及利弊Asp.net
    ASP.NET一些常用正则表达式
    (CHMSoftware)工具集锦
    仿真方面的文章
    TPlan测试过程管理工具技术摘要
    Linux 2.6内核的精彩世界(多媒体)
    Ajax技术实践之完成Ajax自动完成功能
    硬件测试
  • 原文地址:https://www.cnblogs.com/xiaowuga/p/7352220.html
Copyright © 2020-2023  润新知