zoukankan      html  css  js  c++  java
  • hdu 5171 GTY's birthday gift(数学,矩阵快速幂)

    题意:

    开始时集合中有n个数。

    现在要进行k次操作。

    每次操作:从集合中挑最大的两个数a,b进行相加,得到的数添加进集合中。

    以此反复k次。

    问最后集合中所有数的和是多少。

    (2n100000,1k1000000000)

    思路:

    写出来发现是要求Fibonaci的前n个数的和。

    Fibonaci是用矩阵快速幂求的,这个也可以。

    [Sn,Fn,Fn-1]=[某个矩阵]*[Sn-1,Fn-1,Fn-2]

    [S2,F2,F1]=[2,1,1]

    然后写,,,

    这个代码有些繁琐,应该把矩阵操作单独写成函数。

    日后更新。

    代码:

    ll const mol = 10000007;
    
    
    int n,k;
    ll ans;
    ll matrix[4][4];
    int a[100005];
    
    
    void matrixSolve(int k){ // ¾ØÕóµÄk´Î·½
        if(k==0){
            mem(matrix,0);
            matrix[1][1]=1;
            matrix[2][2]=1;
            matrix[3][3]=1;
            return;
        }
        if(k==1){
            mem(matrix,0);
            matrix[1][1]=matrix[1][2]=matrix[1][3]=1;
            matrix[2][2]=matrix[2][3]=1;
            matrix[3][2]=1;
            return;
        }
        matrixSolve(k/2);
        ll tempMatrix[4][4];
        mem(tempMatrix,0);
        rep(i,1,3){
            rep(j,1,3){
                rep(k,1,3){
                    tempMatrix[i][j]=(tempMatrix[i][j]+matrix[i][k]*matrix[k][j]%mol)%mol;
                }
            }
        }
        rep(i,1,3){
            rep(j,1,3){
                matrix[i][j]=tempMatrix[i][j];
            }
        }
        if((k&1)==1){
            ll temp2Matrix[4][4];
            mem(temp2Matrix,0);
            temp2Matrix[1][1]=temp2Matrix[1][2]=temp2Matrix[1][3]=1;
            temp2Matrix[2][2]=temp2Matrix[2][3]=1;
            temp2Matrix[3][2]=1;
    
            ll temp3Matrix[4][4];
            mem(temp3Matrix,0);
            rep(i,1,3){
                rep(j,1,3){
                    rep(k,1,3){
                        temp3Matrix[i][j]=(temp3Matrix[i][j]+tempMatrix[i][k]*temp2Matrix[k][j])%mol;
                    }
                }
            }
            rep(i,1,3){
                rep(j,1,3){
                    matrix[i][j]=temp3Matrix[i][j];
                }
            }
        }
    
    }
    
    ll solve(int k){ //calc Sk
        ll s2=2,f2=1,f1=1;
        matrixSolve(k-2);
        ll sk=(matrix[1][1]*s2+matrix[1][2]*f2+matrix[1][3]*f1)%mol;
        return sk;
    }
    
    int main(){
    
        while(cin>>n>>k){
            ans=0;
            rep(i,1,n){
                scanf("%d",&a[i]);
                ans=(ans+a[i])%mol;
            }
            sort(a+1,a+1+n);
            if(k==1){
               ans=(ans+a[n-1])%mol;
               ans=(ans+a[n])%mol;
               printf("%I64d
    ",ans);
            }
            else{
                int xx=a[n-1];
                int yy=a[n];
                ll ans1=(solve(k)*(ll)xx)%mol;
                ll ans2=((solve(k+1)-1)*(ll)yy)%mol;
                ans=(ans+ans1+ans2)%mol;
                printf("%I64d
    ",ans);
            }
        }
    
        return 0;
    }
  • 相关阅读:
    jQuery加载
    2.第一个flask web程序
    [转]前端懒加载以及预加载
    [转]当你在浏览器中输入 google.com 并且按下回车之后发生了什么?
    [转]如何让在FLASH不浮动在层之上
    逻辑回归基础梳理
    线性回归基础梳理
    [傻瓜式一步到位] 阿里云服务器Centos上部署一个Flask项目
    Java学习之"Hello World"
    JDK安装及Java环境变量配置
  • 原文地址:https://www.cnblogs.com/fish7/p/4309828.html
Copyright © 2011-2022 走看看