码迷,mamicode.com
首页 > 其他好文 > 详细

FCS NOI2018 一试 GG记

时间:2018-02-15 12:30:49      阅读:340      评论:0      收藏:0      [点我收藏+]

标签:noi   clu   str   continue   online   while   void   sharp   csharp   

T1

以为计算几何不会,

据说正解做法很玄学每条线段拆成若干点跑SPFA,取两个最小距离的点构成的线段继续做.

爆0

T2

据说是去年二试加强版

我写了dfs

最后10分

T3

先吐槽一下附中的老爷机,写了40的矩乘被卡成10分,搞得和暴力分一样

其次T3居然是BZOJ原题

最后10分

BZOJ3583

http://www.lydsy.com/JudgeOnline/problem.php?id=3583

技术分享图片

 

 

#include<cstdio>
#include<cstdlib>
using namespace std;
const int mod=1e9+7;
int O[1001][21],I[1001][21];
int n,m,q,x,y,z,ans;
int f[1001];
struct matrix{
    int a[21][21];
    matrix(){
        for(register int i=0;i<m;++i)
            for(register int j=0;j<m;++j)
                a[i][j]=0;
    }
    inline matrix operator*(matrix A)const{
        matrix ret;
        for(register int i=0;i<m;++i)
            for(register int j=0;j<m;++j)
                for(register int k=0;k<m;++k)
                    ret.a[i][j]=(ret.a[i][j]+1ll*a[i][k]*A.a[k][j]%mod)%mod;
        return ret;
    }
    inline matrix operator+(matrix A)const{
        matrix ret;
        for(register int i=0;i<m;++i)
            for(register int j=0;j<m;++j){
                ret.a[i][j]=a[i][j]+A.a[i][j];
                if(ret.a[i][j]>=mod)
                    ret.a[i][j]-=mod;
            }
        return ret; 
    } 
}A[51],B[51],G,S;
inline void calc(int n){
    for(register int i=0;i<m;++i)
        for(register int j=0;j<m;++j)
            G.a[i][j]=S.a[i][j]=0;
    for(register int i=0;i<m;++i)
        G.a[i][i]=S.a[i][i]=1;
    for(register int i=0;i<=31;++i)
        if((n>>i)&1){
            S=S+(B[i]*G);
            G=G*A[i];
        }
}
int main(){
    scanf("%d%d",&n,&m);
    for(register int i=0;i<n;++i){
        for(register int j=0;j<m;++j)scanf("%d",O[i]+j),O[i][j]%=mod;
        for(register int j=0;j<m;++j)scanf("%d",I[i]+j),I[i][j]%=mod;
    }
    for(register int k=0;k<n;++k)
        for(register int i=0;i<m;++i)
            for(register int j=0;j<m;++j)
                A[0].a[i][j]=(A[0].a[i][j]+1ll*I[k][i]*O[k][j]%mod)%mod;
    B[0]=A[0];
    for(register int i=0;i<=31;++i){
        A[i+1]=A[i]*A[i];
        for(register int j=0;j<m;++j)
            ++A[i].a[j][j];
        B[i+1]=B[i]*A[i];
        for(register int j=0;j<m;++j)
            --A[i].a[j][j]; 
    }
    scanf("%d",&q);
    while(q--){
        scanf("%d%d%d",&x,&y,&z);--x;--y;
        if(!z){
            printf("%d\n",(x==y));
            continue;
        }
        calc(z-1);
        for(register int i=0;i<m;++i)f[i]=0; 
        ans=0;
        for(register int i=0;i<m;++i)
            for(register int j=0;j<m;++j)
                f[i]=(f[i]+1ll*O[x][j]*S.a[j][i]%mod)%mod;
        for(register int i=0;i<m;++i)
            ans=(ans+1ll*I[y][i]*f[i]%mod)%mod;
        printf("%d\n",(ans+(x==y))%mod);
    }
    return 0;
} 

  

FCS NOI2018 一试 GG记

标签:noi   clu   str   continue   online   while   void   sharp   csharp   

原文地址:https://www.cnblogs.com/Stump/p/8449375.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!