[AHOI2004]数字迷阵题解
来源:互联网 发布:linux 打印输出到文件 编辑:程序博客网 时间:2024/04/30 02:17
- 题目描述
- 输入输出格式
- 输入格式
- 输出格式
- 输入输出样例
- 输入样例1
- 输出样例1
- 输入样例2
- 输出样例2
- 解决方案
- 代码
题目描述
传送门:https://www.luogu.org/problem/show?pid=2544
输入输出格式
输入格式:
每行有三个正整数,分别是i,j,m,其中i,j<=10^9,2<=m<=10^4。
输出格式:
每行输出对应的第i行,第j列的那个正整数对m取模的结果。
输入输出样例
输入样例#1:
1 2 99
输出样例#1:
2
输入样例#2:
9 1 999
输出样例#2:
22
解决方案
首先我们可以判断出每行都是变形的斐波那契数列,又因为
我们发现第一列增加的值为2或3,其实我们可以发现第一次(第二行)+3,后面两次(3,4行)分别+2-3,再后面的3次是前两次的序列和,即3-2-3……
每一次往后推的项数满足斐波那契数列,且就是前面两次的那些项连起来.即第一列通项为
所以我们可以用O(1)的时间求
即
其实就是斐波那契数列通项公式
其他行就是初值不一样而已,代码不想写注释,自己都觉得奇丑无比……
代码
#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>using namespace std;typedef long long LL;int n,m,p;int x[101][3][3],y[3][3],z[3][3],a[101],k1,k2,ans;int i,j,k,l;int main() { scanf("%d%d%d",&n,&m,&p); m--; x[0][1][2]=x[0][2][1]=x[0][2][2]=1; a[0]=1; for(i=1;a[i-1]*2<=m;i++) { a[i]=a[i-1]*2; for(j=1;j<=2;j++) for(k=1;k<=2;k++) for(l=1;l<=2;l++) x[i][j][k]=(x[i][j][k]+(LL)x[i-1][j][l]*x[i-1][l][k])%p; } y[1][1]=y[2][2]=1; for(i--;i>=0;i--) { if(a[i]<=m) { m-=a[i]; for(j=1;j<=2;j++) for(k=1;k<=2;k++) for(l=1;l<=2;l++) z[j][k]=(z[j][k]+(LL)x[i][j][l]*y[l][k])%p; for(j=1;j<=2;j++) for(k=1;k<=2;k++) { y[j][k]=z[j][k]; z[j][k]=0; } } } k1=((LL)(n*(1+sqrt(5))/2+n-1))%p; k2=((2*k1-n+1)%p+p)%p; ans=((LL)k1*y[1][1]+(LL)k2*y[1][2])%p; printf("%d\n",ans); return 0;}
0 0
- [AHOI2004]数字迷阵题解
- 【AHOI2004】数字迷阵 [ 结论题 ]
- 数字迷阵
- 数字游戏题解
- luoguP1216 数字三角形 题解
- 宝石迷阵思路
- BNU 4304 - 硬币迷阵
- BNU 4304 硬币迷阵
- BNUOJ 4304 硬币迷阵
- 题目1542:黑白迷阵
- ZCMU-1434-糖果迷阵
- pongo题解之覆盖数字
- Codevs2189数字三角形2题解
- 数字8(eight )题解
- 水题-洛谷P2543 [AHOI2004]奇怪的字符串
- 洛谷 P2543 [AHOI2004]奇怪的字符串
- [各种面试题] 黑白迷阵
- [51nod 1527]城堡迷阵
- Java事务之四——成功的案例
- 真搞不懂, 为什么Win 7的的扫雷游戏那么难找, 而且不支持在cmd中用命令行调出, 而且名字变了, 晕!
- 关于在uwsgi server中出现cassandra超时问题的解决
- mmap的实现原理和应用
- TCP/IP协议三次握手与四次握手
- [AHOI2004]数字迷阵题解
- 如何使用Qt进行ROS项目开发调式
- Java事务之五——Template模式
- 各种编程语言的内存模型
- 函数掉用方式下的两种冒泡排序
- C/C++——打开文件读取数据的各种方式
- 结构体和联合体的大小,结构体内存对齐的原因、规则以及柔性数组
- 不申请额外空间调整字符串大小写顺序,大写字母依次放到后面
- Java事务之六——使用动态代理(Dynamic Proxy)