矩阵——bzoj1898: [Zjoi2005]Swamp 沼泽鳄鱼

http://www.lydsy.com/JudgeOnline/problem.php?id=1898
做了这题,我对自己感到失望;
搞竞赛是吧,泪水汗水你肯定得选一个;
但是我感觉我选了两个;

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<ctime>
#include<cstdlib>
using namespace std;
bool f[51][51],ff[51];
int N=10,M=20,Q=1,V=5,K=100,Nfish=2,mo=10;
int out2(){
    int x=rand()%N;
    while(ff[x])x=rand()%N;
    ff[x]=1;
    cout<<x<<' ';
}
void out1(){
    int x=rand()%N,y=rand()%N;
    while(f[x][y]||x==y)x=rand()%N,y=rand()%N;
    f[x][y]=f[y][x]=1;
    cout<<x<<' '<<y<<endl;
}
int main()
{
    freopen("hh.in","w",stdout);
    srand(unsigned(time(0)));
    cout<<N<<' '<<M<<' '<<Q<<' '<<V<<' '<<K<<endl;
    for(int i=1;i<=M;i++)out1();
    cout<<Nfish<<endl;
    for(int i=1;i<=Nfish;i++){
        memset(ff,0,sizeof ff);
        int y=2+rand()%3;
        cout<<y<<' ';
        for(int i=1;i<=y;i++)out2();
        cout<<endl;
    }
}
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define Ll long long
using namespace std;
struct jv{
    int n,m;
    Ll a[100][100];
    jv(){n=m=0;memset(a,0,sizeof a);}
}a,ans,c;
int f[201][05],nn;
bool ok[501];
int n,m,k,x,y,S,E,v,mo=10000;
jv cheng(jv a,jv b){
    jv ans; ans.n=a.n; ans.m=b.m;
    for(int i=1;i<=a.n;i++)
        for(int k=1;k<=a.m;k++)if(a.a[i][k])
            for(int j=1;j<=b.m;j++)if(!ok[j])
                ans.a[i][j]=(ans.a[i][j]+a.a[i][k]*b.a[k][j])%mo;
    return ans; 
}
jv ksm(int y){
    jv ans=c,a=c;
    y-=1;
    while(y){
        if(y&1)ans=cheng(ans,a);
        y>>=1;
        a=cheng(a,a);
    }
    return ans;
}
void make(int k){
    k++;
    memset(ok,0,sizeof ok);
    for(int i=1;i<=nn;i++){
        int x=k%f[i][0];
        if(!x)x=f[i][0];
        ok[f[i][x]]=1;
    }
}
int main()
{
//  freopen("hh.in","r",stdin);
//  freopen("my.out","w",stdout);
    scanf("%d%d%d%d%d",&n,&m,&S,&E,&k);
    a.n=a.m=n;
    for(int i=1;i<=m;i++){
        scanf("%d%d",&x,&y);
        x++;y++;
        a.a[y][x]=a.a[x][y]=1;
    }
    scanf("%d",&nn);
    for(int i=1;i<=nn;i++){
        scanf("%d",&f[i][0]);
        for(int j=1;j<=f[i][0];j++)scanf("%d",&f[i][j]),f[i][j]++;
    }
    c.n=c.m=n;  for(int i=1;i<=n;i++)c.a[i][i]=1;
    for(int i=1;i<=12;i++){make(i);c=cheng(c,a);}
    ans.n=ans.m=n;  for(int i=1;i<=n;i++)ans.a[i][i]=1;
    memset(ok,0,sizeof ok);
    if(k>=12)ans=ksm(k/12);
    for(int i=1;i<=k%12;i++){make(i);ans=cheng(ans,a);}
    printf("%lld",ans.a[++S][++E]);   
}   
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值