hdu4291 暴力循环节+矩阵快速幂
题意:
给你一个关系式,x[n] = 3*x[n-1] + x[n-2],求x(x(x[n]))%1000000007.
思路:
做这个题目要明确一点,就是对于取余操作大多数时候都会出现循环节的情况,尤其是对于像这个题目的转换公式,数据有规律递增,那么也就是说0 1 1 ....等再次出现0 1的时候也就是一定找了循环节,对于这个题目我们找循环节主要不是为了防止超时,而是为了得到正确的答案,因为x[n]很大的时候就的模拟大数,就麻烦了,我们只要找到每一层的循环节,就能把数据弄小,就可以跑三次矩阵快速A掉这个题目了。
下面给出暴力循环节代码(暴力第二层的,最内层把10..7改成第二层的MOD就行了)
#include<stdio.h>
int main ()
{
__int64 a = 0 ,b = 1 ,c;
for(__int64 i = 3 ; ;i ++)
{
c = (b * 3 + a)%1000000007;
a = b ,b = c;
if(a == 0 && b == 1)
{
printf("%I64d\n" ,i - 2);
break;
}
}
getchar();
return 0;
}
暴力后得到最内侧的MOD = 183120
第二层 MOD = 222222224
最外层给了 MOD = 1000000007
AC代码
#include<stdio.h>
#include<string.h>
__int64 MOD1 = 183120;
__int64 MOD2 = 222222224;
__int64 MOD3 = 1000000007; __int64 MOD;
typedef struct
{
__int64 mat[5][5];
}A; A mat_mat(A a ,A b)
{
A c;
memset(c.mat ,0 ,sizeof(c.mat));
for(int k = 1 ;k <= 2 ;k ++)
for(int i = 1 ;i <= 2 ;i ++)
if(a.mat[i][k])
for(int j = 1 ;j <= 2 ;j ++)
c.mat[i][j] = (c.mat[i][j] + a.mat[i][k] * b.mat[k][j]) % MOD; return c;
} A quick_mat(A a ,__int64 b)
{
A c;
memset(c.mat ,0 ,sizeof(c.mat));
c.mat[1][1] = c.mat[2][2] = 1;
while(b)
{
if(b & 1) c = mat_mat(c ,a);
a = mat_mat(a ,a);
b >>= 1;
}
return c;
} int main ()
{
__int64 n ,i;
A aa ,bb;
aa.mat[1][1] = 0 ,aa.mat[1][2] = 1;
aa.mat[2][1] = 1 ,aa.mat[2][2] = 3;
while(~scanf("%I64d" ,&n))
{
if(n == 0){printf("0\n");continue;}
if(n == 1){printf("1\n");continue;}
MOD = MOD1;
bb = quick_mat(aa ,n - 1);
n = (0 * bb.mat[1][2] + 1 * bb.mat[2][2])% MOD; if(n == 0){printf("0\n");continue;}
if(n == 1){printf("1\n");continue;}
MOD = MOD2;
bb = quick_mat(aa ,n - 1);
n = (0 * bb.mat[1][2] + 1 * bb.mat[2][2])% MOD; if(n == 0){printf("0\n");continue;}
if(n == 1){printf("1\n");continue;}
MOD = MOD3;
bb = quick_mat(aa ,n - 1);
n = (0 * bb.mat[1][2] + 1 * bb.mat[2][2])% MOD; printf("%I64d\n" ,n);
}
return 0;
}
hdu4291 暴力循环节+矩阵快速幂的更多相关文章
- 循环节 + 矩阵快速幂 - HDU 4291 A Short problem
A Short problem Problem's Link Mean: 给定一个n,求:g(g(g(n))) % 1000000007 其中:g(n) = 3g(n - 1) + g(n - 2), ...
- hdu 5895 Mathematician QSC 指数循环节+矩阵快速幂
Mathematician QSC Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- 2019牛客多校第五场 generator 1——广义斐波那契循环节&&矩阵快速幂
理论部分 二次剩余 在数论中,整数 $X$ 对整数 $p$ 的二次剩余是指 $X^2$ 除以 $p$ 的余数. 当存在某个 $X$,使得式子 $X^2 \equiv d(mod \ p)$ 成立时,称 ...
- HDU - 5451 Best Solver(循环节+矩阵快速幂)
Best Solver The so-called best problem solver can easily solve this problem, with his/her childhood ...
- HDU 1005 Number Sequence【斐波那契数列/循环节找规律/矩阵快速幂/求(A * f(n - 1) + B * f(n - 2)) mod 7】
Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- hdu4291之矩阵快速幂
A Short problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- HDU1005 找规律 or 循环点 or 矩阵快速幂
http://acm.hdu.edu.cn/showproblem.php?pid=1005 1.一开始就注意到了n的数据范围 <=100 000 000,但是还是用普通的循环做的,自然TLE了 ...
- CCF 201312-4 有趣的数 (数位DP, 状压DP, 组合数学+暴力枚举, 推公式, 矩阵快速幂)
问题描述 我们把一个数称为有趣的,当且仅当: 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次. 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前. 3. 最高 ...
- UVaLive 3704 Cellular Automaton (循环矩阵 + 矩阵快速幂)
题意:一个细胞自动机包含 n 个格子,每个格子取值是 0 ~ m-1,给定距离,则每次操作后每个格子的值将变成到它距离不超过 d 的所有格子在操作之前的值之和取模 m 后的值,其中 i 和 j 的距离 ...
随机推荐
- WebService和Web API 区别
WebService的特征: 1 基于SOAP协议的,数据格式为XML 2 只支持HTTP协议,只能部署在IIS上 3 不是开源的,但可以被任意一个了解XML的人使用 SOAP :简单对象访问协议Si ...
- 该死的端口占用!教你用 Shell 脚本一键干掉它!
1. 前言 大家好,我是安果! 在 Web 开发中,经常会遇到「端口被占用」的场景 常规解决方案是: 使用 lsof -i 命令查询占用端口的进程 PID 利用 kill -9 PID 干掉目标进程 ...
- swaks制作钓鱼邮件
一.在网站:https://bccto.me/ 申请一个十分钟的邮箱 二.使用命令行,命令行解释如下: --from hacker@qq.com //发件人的邮箱 --ehlo qq.com // ...
- MYSQL的replace into
replace into t(id, update_time) values(1, now()); 或 replace into t(id, update_time) select 1, now(); ...
- incubator-dolphinscheduler 如何在不写任何新代码的情况下,能快速接入到prometheus和grafana中进行监控
一.prometheus和grafana 简介 prometheus是由谷歌研发的一款开源的监控软件,目前已经贡献给了apache 基金会托管. 监控通常分为白盒监控和黑盒监控之分. 白盒监控:通过监 ...
- 【图像处理】OpenCV+Python图像处理入门教程(四)几何变换
这篇随笔介绍使用OpenCV进行图像处理的第四章 几何变换. 4 几何变换 图像的几何变换是指将一幅图像映射到另一幅图像内.有缩放.翻转.仿射变换.透视.重映射等操作. 4.1 缩放 使用cv2. ...
- 【LeetCode】10.Regular Expression Matching(dp)
[题意] 给两个字符串s和p,判断s是否能用p进行匹配. [题解] dp[i][j]表示s的前i个是否能被p的前j个匹配. 首先可以分成3大类情况,我们先从简单的看起: (1)s[i - 1] = p ...
- 攻防世界 reverse Newbie_calculations
Newbie_calculations Hack-you-2014 题目名百度翻译成新手计算,那我猜应该是个实现计算器的题目.... IDA打开程序,发现一长串的函数反复调用,而且程序没有输入,只有输 ...
- 浅析MyBatis(四):全自动写代码的MyBatis逆向工程
在前面几篇文章中,笔者介绍了 MyBatis 的运行流程,在此基础上简单介绍了手写 MyBatis 简易框架与自定义 MyBatis 插件的步骤,相信大家对于 MyBatis 框架的使用流程已经游刃有 ...
- 力扣 - 208. 实现Trie(前缀树)
目录 题目 思路 代码 复杂度分析 题目 208. 实现 Trie (前缀树) 思路 在我们生活中很多地方都用到了前缀树:自动补全,模糊匹配,九宫格打字预测等等... 虽然说用哈希表也可以实现:是否出 ...