zoukankan      html  css  js  c++  java
  • bzoj4547: Hdu5171 小奇的集合

    补写一下。

    这个看起来就很水啊。

    然后的话k很大?那就推推柿子矩乘走起。

    然后WA成傻逼,准备四点半回家硬生生拖到五点。

    看到abs(a)就觉得哪里不对但是没意识到要判负。。。

    矩阵不写了,代码很好懂。

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    typedef long long LL;
    const LL mod=10000007;
    
    struct Martrix
    {
        LL mp[10][10];
    }ans,A;
    Martrix multi(Martrix a,Martrix b)
    {
        Martrix c;
        memset(c.mp,0,sizeof(c));
        for(LL i=1;i<=3;i++)
            for(LL j=1;j<=3;j++)
                for(LL k=1;k<=3;k++)
                    c.mp[i][j]=(c.mp[i][j]+(a.mp[i][k]*b.mp[k][j])%mod)%mod;
        return c;
    }
    void init(LL key,LL k)
    {
        memset(ans.mp,0,sizeof(ans.mp));
        ans.mp[1][1]=1;
        ans.mp[2][1]=key;
        ans.mp[3][1]=(1+key)*k%mod;
        A.mp[1][1]=0;A.mp[1][2]=1;A.mp[1][3]=0;
        A.mp[2][1]=1;A.mp[2][2]=1;A.mp[2][3]=0;
        A.mp[3][1]=k;A.mp[3][2]=k;A.mp[3][3]=1;
    }
    
    LL a[1100000];
    int main()
    {
    //    freopen("data.in","r",stdin);
    //    freopen("lj.out","w",stdout);
        LL n,k;LL sum=0,fmax=-999999999,smax=-999999999;
        scanf("%lld%lld",&n,&k);
        for(LL i=1;i<=n;i++)
        {
            scanf("%lld",&a[i]), sum=(sum+a[i])%mod;
            if(fmax<a[i]){swap(fmax,smax);fmax=a[i];}
            else if(smax<a[i])smax=a[i];
        }
        while(smax<0) sum+=fmax+smax, smax=fmax+smax, k--;
        if(k==0){printf("%lld
    ",sum);return 0;}
        else if(k==1){printf("%lld
    ",(sum+fmax+smax)%mod);return 0;}
        
        init(1,smax);
        LL p=k-2;
        while(p!=0)
        {
            if(p%2==1)ans=multi(A,ans);
            A=multi(A,A);p/=2;
        }
        sum=(sum+ans.mp[3][1])%mod;
        
        init(2,fmax);
        p=k-2;
        while(p!=0)
        {
            if(p%2==1)ans=multi(A,ans);
            A=multi(A,A);p/=2;
        }
        sum=(sum+ans.mp[3][1])%mod;
        
        printf("%lld
    ",sum%mod);
        return 0;
    }
  • 相关阅读:
    xfire webServeic 例子
    Spring3 url匹配规则
    js 字符串转化成数字
    JS回车事件,兼容目前所有浏览器
    笔记:Zygote和SystemServer进程启动过程
    安卓Task和Back Stack
    札记:Property动画
    札记:翻译-使用Scene和Transition实现【场景切换】动画效果
    算法:排序
    [BOT]自定义ViewPagerStripIndicator
  • 原文地址:https://www.cnblogs.com/AKCqhzdy/p/8551524.html
Copyright © 2011-2022 走看看