Description

继NOI2014后,小H又发现了一种新的生成随机数的方法。
首先,给定三个随机种子P,C1,C2(C1≤C2)生成一个序列{xi},{xi}满足
对于任意的i≥0,满足以下递推式Xi+2=(Xi+1+Xi) mod P
其中x0=C1, x1=C2。
接着,利用序列{xi},可以生成一个序列{ai}。序列{ai}的生成方式如下
对于任意的i≥1,ai=∑xj^2(0≤j≤i) mod P
然后,给定一个正整数Q,小H会进行Q次下述操作:每次选定两个正整数x, y,将ax和ay互换。
小H希望检验一下序列{ai}是否是随机的。他还是希望使用NOI2014那道题的方法,生成一个N×M的矩阵,其中N表示行,M表示列。我们记这个矩阵为D,在D的第1行依次放入a1~aM,第2行放入aM+1~a2M,以此类推,那么矩阵D的第i行第j列的数Di,j就应该为a(i-1)*M+j。然后,类似方格取数,从矩阵的左上角(1,1)走到右下角(N,M),途中只能向右走或者向下走,这样他经过的方格数就应该是(N+M-1)。然后按照经过的顺序将每个方格的数字提取出来,组成一个序列叫做路径序列。他想知道,自己能得到的字典序最小的路径序列是什么。注意:为了方便,如果当前格向下和向右的方格的数字相同,那么我们认为向下的方格的数字小于向右的方格的数字。

Input

输入的第一行为六个正整数N,M,Q,P,C1,C2。意义见题目描述。
接下来的Q行,每行一个操作:包含两个正整数x, y。

Output

输出一行,共(N+M-1)个正整数,表示字典序最小的路径序列。

令F[-1]=1,F[0]=0,F[i]=F[i-1]+F[i-2](i>0)

易证a[i](初始)=(c1^2*(F[n]*F[n-1]+1)+c2^2*F[n]*F[n+1]+2*c1*c2*(n为偶数?F[n]^2:F[n-1]*F[n+1]))mod p

斐波那契数列可以用倍增O(logn)求出

字典序最小可以贪心

4471:

#include<cstdio>
typedef long long i64;
int n,m,q,P,c1,c2;
inline int read(){
int x=,c=getchar();
while(c>||c<)c=getchar();
while(c>&&c<)x=x*+c-,c=getchar();
return x;
}
inline i64 read64(){
i64 x=;
int c=getchar();
while(c>||c<)c=getchar();
while(c>&&c<)x=x*+c-,c=getchar();
return x;
}
int stk[],stp=;
int print(int x){
if(!x)stk[stp++]=;
while(x)stk[stp++]=x%,x/=;
for(int i=stp-;i>=;i--)putchar(stk[i]+);
stp=;
}
inline void cal(int a,int b,int c,int d,int&e,int&f){
e=(i64(b-a)*c+i64(a)*d)%P;
f=(i64(a)*c+i64(b)*d)%P;
if(e<)e+=P;
if(f<)f+=P;
}
struct Seq_A{
int as[],bs[];
i64 c12,c22,c1c2;
void init(){
as[]=,bs[]=;
for(int i=;i<;i++)cal(as[i-],bs[i-],as[i-],bs[i-],as[i],bs[i]);
c12=i64(c1)*c1%P;
c22=i64(c2)*c2%P;
c1c2=i64(c1)*c2*%P;
}
int operator[](i64 x){
i64 v1,v2,v3;
bool d=x&;
--x;
int a=,b=;
for(int i=;x;i++,x>>=)if(x&)cal(a,b,as[i],bs[i],a,b);
v1=a;v2=b;v3=a+b;
if(d)return ((v1*v2+)%P*c12%P+v2*v3%P*c22%P+v1*v3%P*c1c2%P)%P;
return ((v1*v2+)%P*c12%P+v2*v3%P*c22%P+v2*v2%P*c1c2%P)%P;
}
}a0;
namespace Map{
const int p=;
i64 xs[p];
int ys[p];
bool ed[p];
int&get(i64 x){
unsigned int w=x%p;
while(ed[w]){
if(xs[w]==x)return ys[w];
w+=;
if(w>=p)w-=p;
}
ed[w]=;
xs[w]=x;
ys[w]=a0[x];
if(ys[w]<)ys[w]+=P;
return ys[w];
}
}
int main(){
n=read();m=read();q=read();P=read();c1=read();c2=read();
a0.init();
for(int i=;i<q;i++){
i64 a=read64(),b=read64();
int&a1=Map::get(a),&a2=Map::get(b),a3;
a3=a1;a1=a2;a2=a3;
}
int xp=,yp=,ans;
print(Map::get());
while(xp<n||yp<m){
if(xp==n)++yp;
else if(yp==m)++xp;
else{
int a1=Map::get(i64(xp)*m+yp),a2=Map::get(i64(xp-)*m+yp+);
if(a1<a2)++xp;
else ++yp;
}
putchar();
print((Map::get(i64(xp-)*m+yp)+P)%P);
}
return ;
}

4490:

#include<cstdio>
typedef long long i64;
int n,m,q,P,c1,c2;
inline int read(){
int x=,c=getchar();
while(c>||c<)c=getchar();
while(c>&&c<)x=x*+c-,c=getchar();
return x;
}
inline i64 read64(){
i64 x=;
int c=getchar();
while(c>||c<)c=getchar();
while(c>&&c<)x=x*+c-,c=getchar();
return x;
}
inline void cal(int a,int b,int c,int d,int&e,int&f){
e=(i64(b-a)*c+i64(a)*d)%P;
f=(i64(a)*c+i64(b)*d)%P;
if(e<)e+=P;
if(f<)f+=P;
}
struct Seq_A{
int as[],bs[];
i64 c12,c22,c1c2;
void init(){
as[]=,bs[]=;
for(int i=;i<;i++)cal(as[i-],bs[i-],as[i-],bs[i-],as[i],bs[i]);
c12=i64(c1)*c1%P;
c22=i64(c2)*c2%P;
c1c2=i64(c1)*c2*%P;
}
int operator[](i64 x){
i64 v1,v2,v3;
bool d=x&;
--x;
int a=,b=;
for(int i=;x;i++,x>>=)if(x&)cal(a,b,as[i],bs[i],a,b);
v1=a;v2=b;v3=a+b;
if(d)return ((v1*v2+)%P*c12%P+v2*v3%P*c22%P+v1*v3%P*c1c2%P)%P;
return ((v1*v2+)%P*c12%P+v2*v3%P*c22%P+v2*v2%P*c1c2%P)%P;
}
}a0;
namespace Map{
const int p=;
i64 xs[p];
int ys[p];
bool ed[p];
int&get(i64 x){
unsigned int w=x%p;
while(ed[w]){
if(xs[w]==x)return ys[w];
w+=;
if(w>=p)w-=p;
}
ed[w]=;
xs[w]=x;
ys[w]=a0[x];
if(ys[w]<)ys[w]+=P;
return ys[w];
}
}
int stk[],stp=;
int main(){
i64 nth=,ans=;
n=read();m=read();q=read();P=read();c1=read();c2=read();
a0.init();
for(int i=;i<q;i++){
i64 a=read64(),b=read64();
int&a1=Map::get(a),&a2=Map::get(b),a3;
a3=a1;a1=a2;a2=a3;
}
int xp=,yp=;
ans=(ans+Map::get()*(nth++))%P;
while(xp<n||yp<m){
if(xp==n)++yp;
else if(yp==m)++xp;
else{
int a1=Map::get(i64(xp)*m+yp),a2=Map::get(i64(xp-)*m+yp+);
if(a1<a2)++xp;
else ++yp;
}
ans=(ans+Map::get(i64(xp-)*m+yp)*(nth++))%P;
}
printf("%lld\n",(ans%P+P)%P);
return ;
}

bzoj4471 bzoj4490 随机数生成器Ⅱ的更多相关文章

  1. bzoj4490 随机数生成器Ⅱ加强版

    题目链接 题意 给出参数\(C_1,C_2,P\)按如下方式生成一个长度为\(n \times m\)的序列\(x\): \(x_0 = C_1,x_1=C2\) \(x_i=(x_{i-1}+x_{ ...

  2. 【原创】开源Math.NET基础数学类库使用(13)C#实现其他随机数生成器

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

  3. 【BZOJ-3122】随机数生成器 BSGS

    3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1362  Solved: 531[Submit][Sta ...

  4. BZOJ-2875 随机数生成器 矩阵乘法快速幂+快速乘

    题目没给全,吃X了... 2875: [Noi2012]随机数生成器 Time Limit: 10 Sec Memory Limit: 512 MB Submit: 1479 Solved: 829 ...

  5. [BZOJ3671][UOJ#6][NOI2014]随机数生成器

    [BZOJ3671][UOJ#6][NOI2014]随机数生成器 试题描述 小H最近在研究随机算法.随机算法往往需要通过调用随机数生成函数(例如Pascal中的random和C/C++中的rand)来 ...

  6. NOI2014 随机数生成器

    随机数生成器 [问题描述] 小H最近在研究随机算法.随机算法往往需要通过调用随机数生成函数(例如Pascal中的random和C/C++中的rand)来获得随机性.事实上,随机数生成函数也并不是真正的 ...

  7. 【BZOJ 3122】 [Sdoi2013]随机数生成器 (BSGS)

    3122: [Sdoi2013]随机数生成器 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1442  Solved: 552 Description ...

  8. Linux下对拍脚本与随机数生成器

    对拍脚本 新建一个文档 check.sh 作为对拍脚本. #!/bin/bash while(true)do #死循环 ./data > .in #运行数据生成器,将数据输出到1.in ./st ...

  9. 矩阵(快速幂):COGS 963. [NOI2012] 随机数生成器

    963. [NOI2012] 随机数生成器 ★★   输入文件:randoma.in   输出文件:randoma.out   简单对比 时间限制:1 s   内存限制:128 MB [问题描述] 栋 ...

随机推荐

  1. C++11标准的智能指针、野指针、内存泄露的理解(日后还会补充,先浅谈自己的理解)

    1.野指针的概念.成因以及避免 首先,来说说什么是野指针,所谓野指针就是一个指向未申请访问受限的内存区域或者已经删除了的对象的指针. 什么意思呢?就是本来一个指针指向一个对象.一块内存,但是由于程序( ...

  2. 2018-2019-2 网络对抗技术 20165202 Exp4 恶意代码分析

    博客目录 一.实践目标 二.实践内容 1.系统运行监控 2.恶意软件分析 三.实验步骤 四.基础问题回答 五.遇到的问题及解决 六.实验总结 一.实践目标 监控你自己系统的运行状态,看有没有可疑的程序 ...

  3. UI基础:UIControl及其子类

    UISegmentedControl  UISegmentedControl 是iOS中的分段控件 每个segment 都能被点击,相当于集成了若干个button. 通常我们会点击不同的segment ...

  4. 【转】C# Socket通信编程

    https://www.cnblogs.com/dotnet261010/p/6211900.html#undefined 一:什么是SOCKET socket的英文原义是“孔”或“插座”.作为进程通 ...

  5. Ajax请求数据的两种方式

    ajax 请求数据的两种方法,有需要的朋友可以参考下. 实现ajax 异步访问网络的方法有两个.第一个是原始的方法,第二个是利用jquery包的 原始的方法不用引入jquery包,只需在html中编写 ...

  6. 通过JS动态创建和删除HTML元素

    <script type="text/javascript" language="Javascript"> function InputOnBlur ...

  7. 温度传感器的AD值,电压和电阻的计算方法

    V是输入的电压,VCC是标准电压,R为固定电阻,NTC为热敏电阻.计算公式是V=(NTC/(NTC+R))*VCC电压或电阻转化AD的计算方式为AD=(V/VCC)*2^n=(NTC/(NTC+R)) ...

  8. [LeetCode&Python] Problem 867. Transpose Matrix

    Given a matrix A, return the transpose of A. The transpose of a matrix is the matrix flipped over it ...

  9. 抓老鼠 codeForce 148D - Bag of mice 概率DP

    设dp[i][j]为有白老鼠i只,黑老鼠j只时轮到公主取时,公主赢的概率. 那么当i = 0 时,为0 当j = 0时,为1 公主可直接取出白老鼠一只赢的概率为i/(i+j) 公主取出了黑老鼠,龙必然 ...

  10. HDU 4666 最远曼哈顿距离

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4666 关于最远曼哈顿距离的介绍: http://blog.csdn.net/taozifish/ar ...