P5110 块速递推

news/2024/12/4 17:13:56/

传送门

为啥我就没看出来有循环节呢……

打表可得,这个数列是有循环节的,循环节为\(10^9+6\),然后分块预处理,即取\(k=sqrt(10^9+6)\),然后分别预处理出转移矩阵\(A\)\(A^1,A^2,...,A^{k-1}\)\(A^k,A^{2k},...\),那么每一次就能\(O(1)\)回答询问了

注意常数问题……这份代码勉强卡过……建议矩阵里的元素别开数组直接用四个变量存会快一点……

//minamoto
#include<bits/stdc++.h>
#define R register
#define ull unsigned long long
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
using namespace std;
const int N=4e4+5,P=1e9+7;
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
namespace Mker
{unsigned long long SA,SB,SC;void init(){scanf("%llu%llu%llu",&SA,&SB,&SC);}unsigned long long rand(){SA^=SA<<32,SA^=SA>>13,SA^=SA<<1;unsigned long long t=SA;SA=SB,SB=SC,SC^=t^SA;return SC;}
}
struct Matrix{int a[2][2];Matrix(){a[0][0]=a[0][1]=a[1][0]=a[1][1]=0;}int* operator [](const int &x){return a[x];}Matrix operator *(Matrix b){Matrix res;res[0][0]=add(1ll*a[0][0]*b[0][0]%P,1ll*a[0][1]*b[1][0]%P);res[0][1]=add(1ll*a[0][0]*b[0][1]%P,1ll*a[0][1]*b[1][1]%P);res[1][0]=add(1ll*a[1][0]*b[0][0]%P,1ll*a[1][1]*b[1][0]%P);res[1][1]=add(1ll*a[1][0]*b[0][1]%P,1ll*a[1][1]*b[1][1]%P);return res;}
}bin1[N],bin2[N],res;int ans,T,n,len;
void init(){res[0][0]=233,res[0][1]=1,res[1][0]=666,bin1[1]=res;len=sqrt(1e9+6),bin1[0][0][0]=bin1[0][1][1]=bin2[0][0][0]=bin2[0][1][1]=1;fp(i,2,len-1)bin1[i]=bin1[i-1]*res;bin2[1]=bin1[len-1]*res;fp(i,2,len+1)bin2[i]=bin2[i-1]*bin2[1];
}
int main(){
//  freopen("testdata.in","r",stdin);init(),scanf("%d",&T);Mker::init();while(T--){Matrix res;n=Mker::rand()%(P-1);res[0][0]=1;if(n<=1)ans^=n;else res=res*bin2[(n-1)/len]*bin1[(n-1)%len],ans^=res[0][0];}printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/bztMinamoto/p/10164361.html


http://www.ppmy.cn/news/306984.html

相关文章

STM32驱动Nokia5110

//以下是lcd5110.c #include "lcd5110.h" #include "english_6x8_pixel.h" //中文字库自己添加&#xff0c;如果没有请注释起来#include "write_chinese_string_pixel.h" //lcdgpio初始化函数 //GPIOC.0.9.10.11.12推挽输出&#xff0c;G…

linux驱动安装完桌面分辨率,kunbutu15.04安装后调整分辨率

在vbox里边安装了Kubuntu15.04虚拟机&#xff0c;安装过程还算顺利但是由于分辨率的问题&#xff0c;无法显示完全&#xff0c;折腾了我好一会&#xff0c;网上的说法可能只是应用于个人情况&#xff0c;所以我也记录下我的情况&#xff01; 我的本子是戴尔n5110 15寸的屏幕&am…

DELL笔记本安装windows10与deepin双系统详细图文教程

首先&#xff0c;我们的电脑上应该安装好了一个windows操作系统&#xff0c;我的系统是win10 1809版本。 工具&#xff1a; 1、装有win10系统的DELL电脑一台 2、4g以上的u盘一个 第一步 下载iso镜像 从deepin官网下载iso镜像&#xff0c;建议从百度云下&#xff0c;比较方…

arduino uno + nokia 5110

现在外面风雨交加&#xff0c;中午一盒隆江猪脚饭都没吃完的我饿得已经看不动QT的文档了&#xff0c;于是翻出实验室昨天入货的nokia5110玩下&#xff0c;显示个求救信号。 看图&#xff1a;NOKIA 5110 亲爱的arduino就不要爆照了 下面上过程&#xff0c;对于懒人来说&#xf…

如何用STM32驱动诺基亚5110显示屏?

关注星标公众号&#xff0c;不错过精彩内容 转自 | 嵌入式从0到1 早期诺基亚5110显示屏用51单片机驱动的比较多&#xff0c;今天分享一下用STM32驱动诺基亚5110显示屏的方法。 NOKIA 5110 屏 Nokia5110屏是一个非常经典的液晶显示模块&#xff0c;在作者玩单片机的时候&#xf…

洛谷P5110 块速递推 题解

洛谷P5110 块速递推 题解 题目链接&#xff1a;P5110 块速递推 题意&#xff1a;给定一个数列 a a a 满足递推式 a 0 0 , a 1 1 a n 233 a n − 1 666 a n − 2 a_00,a_11 \\a_n 233a_{n-1}666a_{n-2} a0​0,a1​1an​233an−1​666an−2​ 求 a n m o d ( 1 0 9 7 )…

【Arduino基础教程】LCD5110显示屏

Nokia 5110显示屏模块 准备材料 Arduino UNO *1Nokia 5110 LCD *1跳线 若干 接线 Nokia 5110显示屏接线示意图 Nokia 5110ArduinoRST->6CE->7DC->5DIN->4CLK->3VCC->5VBL->3V3GND->GND 加载库文件 到http://www.rinkydinkelectronics.com/download.php…

使用fill_n算法

今天使用这个算法来给一个数组赋值&#xff0c;所以把它的使用过程记录下来&#xff1a; fill_n函数的作用是&#xff1a;给你一个起始点&#xff0c;然后再给你一个数值count和val。把从起始点开始依次赋予count个元素val的值。 注意&#xff1a; 不能在没有元素的空容器上调…