URAL1561 Winnie the Pooh

题目描述:

vjudge

题解:

高消(线性基)模$7$。

可以算是板子了。

具体见代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1050;
const int MOD = 7;
template<typename T>
inline void read(T&x)
{
    T f = 1,c = 0;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){c=c*10+ch-'0';ch=getchar();}
    x = f*c;
}
int n,m;
char op[20],s0[20];
int gtdt()
{
    scanf("%s",s0+1);
    if(s0[1]=='S'&&s0[2]=='u')return 0;
    if(s0[1]=='M')return 1;
    if(s0[1]=='T'&&s0[2]=='u')return 2;
    if(s0[1]=='W')return 3;
    if(s0[1]=='T'&&s0[2]=='h')return 4;
    if(s0[1]=='F')return 5;
    if(s0[1]=='S'&&s0[2]=='a')return 6;
    return -1;
}
void print(int x)
{
    if(x==0)puts("Sunday");
    if(x==1)puts("Monday");
    if(x==2)puts("Tuesday");
    if(x==3)puts("Wednesday");
    if(x==4)puts("Thursday");
    if(x==5)puts("Friday");
    if(x==6)puts("Saturday");
}
int Inv[7]={0,1,4,5,2,3,6};
struct Vec
{
    int a[N];
    void rd(){for(int i=1;i<=m;i++)read(a[i]),a[i]%=MOD;}
}v0;
bool fg=0;
struct lb
{
    Vec v[N];int vl[N];
    bool check(Vec x)
    {
        for(int i=1;i<=m;i++)if(x.a[i])
        {
            if(!v[i].a[i])return 1;
            for(int j=i,now=Inv[x.a[i]];j<=m;j++)x.a[j]=x.a[j]*now%MOD;
            for(int j=i;j<=m;j++)x.a[j]=(x.a[j]-v[i].a[j]+MOD)%MOD;
        }
        return 0;
    }
    int query(Vec x)
    {
        int r1 = 0,r2 = 1,r = 0;
        for(int i=1;i<=m;i++)if(x.a[i])
        {
            if(!v[i].a[i])return -1;
            r=x.a[i];r2=r2*r%MOD,r1=r1*Inv[r]%MOD;
            for(int j=i,now=Inv[x.a[i]];j<=m;j++)x.a[j]=x.a[j]*now%MOD;
            r1=(r1+vl[i])%MOD;
            for(int j=i;j<=m;j++)x.a[j]=(x.a[j]-v[i].a[j]+MOD)%MOD;
        }
        return r1*r2%MOD;
    }
    void push(Vec x,int vl0)
    {
        for(int i=1;i<=m;i++)if(x.a[i])
        {
            vl0=vl0*Inv[x.a[i]]%MOD;
            for(int j=i,now=Inv[x.a[i]];j<=m;j++)x.a[j]=x.a[j]*now%MOD;
            if(!v[i].a[i]){v[i]=x,vl[i]=vl0;break;}
            vl0=(vl0-vl[i]+MOD)%MOD;
            for(int j=i;j<=m;j++)x.a[j]=(x.a[j]+MOD-v[i].a[j])%MOD;
        }
    }
}tr;
int main()
{    
//    freopen("s.in","r",stdin);
//    freopen("s.out","w",stdout);
    read(n);
    for(int i=1,w;i<=n;i++)
    {
        scanf("%s",op+1);
        if(op[1]=='A')m++;
        else if(op[1]=='L')
        {
            v0.rd();w=(MOD-gtdt()+gtdt())%MOD;
            if(!tr.check(v0))
            {
                if(tr.query(v0)!=w)fg=1;
            }else    tr.push(v0,w);
        }else
        {
            v0.rd();w=gtdt();
            if(fg)puts("Already crazy");
            else if(tr.check(v0))puts("Don't know");
            else print((w+tr.query(v0))%MOD);
        }
    }
    return 0;
}
View Code

 

posted @ 2019-05-15 10:23  LiGuanlin  阅读(174)  评论(0编辑  收藏  举报