[NOI2014]随机数生成器

本文通过具体实例详细解析了一种矩阵路径构造算法的过程。通过定义矩阵A和路径集合B、未经过路径集合C,逐步推导出必须经过的路径及不可经过的路径集合,最终确定了完整的路径集合。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接照着题目构造Xi,i[1,nm]

12917
51162
41038

我们把矩阵数组记为A
路径集合B,路径不经过的集合C
首先:
A1,3=1必须经过
那么A2..3,1..2(={4,5,11,10})A1..0,4..4(O̸)不能经过
然后A2,4=2也必须经过。
A3..3,1..3(={4,10,3})A1..1,5..4(O̸)不能经过
现在为止:
B={1,2} C={3,4,5,10,11}
显然,6也必须经过(3,4,5不能经过)
那么A3..3,1..2(={4,10})A1..1,4..4(={7})不能经过
B={1,2,6} C={3,4,5,7,10,11}
后面同理,最后得:
B={1,2,6,8,9,12} C={3,4,5,7,10,11}
所以不就是贪心???

ll x,a,b,c,d;
#define __ 5000
#define _ __*__
int n,m,g[_+10],k[_+10],l[__+10],r[__+10];
void swap(int x,int y)
{
    int ___=g[x];
    g[x]=g[y];
    g[y]=___;
}
int main(){
    x=read();
    a=read();
    b=read();
    c=read();
    d=read();
    n=read();
    m=read();
    fr(i,1,n*m)
        g[i]=i;
    fr(i,1,n*m)
    {
        x=(a*x*x+b*x+c)%d;
        int k=x%i+1;
        swap(i,k);
    }
    fr(i,1,read())
    {
        int u=read(),v=read();
        swap(u,v);
    }
    fr(i,1,n*m)
        k[g[i]]=i-1;
    fr(i,1,n)
    {
        l[i]=1;
        r[i]=m;
    }
    fr(i,1,n*m)
        if(k[i]%m+1>=l[k[i]/m+1]&&k[i]%m+1<=r[k[i]/m+1])
        {
            printf("%d ",i);
            fr(j,1,k[i]/m)
                r[j]=min(r[j],k[i]%m+1);
            fr(j,k[i]/m+2,n)
                l[j]=max(l[j],k[i]%m+1);
        }
    rt 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值