hdu-2256 Problem of Precision---矩阵快速幂+数学技巧
2024-08-29 13:03:43
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=2256
题目大意:
题目要求的是(sqrt(2)+sqrt(3))^2n %1024向下取整的值
解题思路:
这里很多人会直接认为结果等于(an+bn*sqrt(6))%1024,但是这种结果是错的,因为这边涉及到了double,必然会有误差,所以根double有关的取模都是错误的思路
转载于:https://blog.csdn.net/chenguolinblog/article/details/10212567
上述思路是转载的,我就是上面说的“很多人”,虽然递推矩阵写出来的,但是还是没想到可以转化成上面那样。直接输出2*a-1就是答案。这里也需要记住double取模是错误的
#include<bits/stdc++.h>
using namespace std;
int MOD = ;
struct Mat
{
int a[][];
int n, m;//n为行数,m为列数
Mat(int n, int m):n(n), m(m)
{
memset(a, , sizeof(a));
}
void init()
{
for(int i = ; i < n; i++)a[i][i] = ;//初始化成单位矩阵
}
void output()
{
for(int i = ; i < n; i++)
{
for(int j = ; j < m; j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
}
};
Mat mul(Mat a, Mat b)//矩阵乘法
{
Mat tmp(a.n, b.m);//矩阵乘法结果矩阵行数为a的行数,列数为b的列数
for(int i = ; i < a.n; i++)
{
for(int j = ; j < b.m; j++)
{
for(int k = ; k < a.m; k++)//a.m == b.n(乘法的前提条件)
{
tmp.a[i][j] += (a.a[i][k] * b.a[k][j] % MOD);
tmp.a[i][j] %= MOD;
}
}
}
return tmp;
}
Mat pow(Mat a, int n)
{
Mat tmp(a.n, a.m);
tmp.init();
while(n)
{
if(n & )tmp = mul(tmp, a);
n /= ;
a = mul(a, a);
}
return tmp;
}
int main()
{
int T, n;
cin >> T;
Mat a(, );
a.a[][] = , a.a[][] = ;
a.a[][] = , a.a[][] = ;
while(T--)
{
cin >> n;
Mat ans = pow(a, n);
//ans.output();
int x = ans.a[][], y = ans.a[][];
cout<<( * x - ) % MOD<<endl;
}
}
最新文章
- 【海岛帝国系列赛】No.2 海岛帝国:“落汤鸡”市的黑帮危机
- 设置图片自适应DIV大小
- JavaScript的语法要点 2 - Scope Chain
- LNMP1.2一键安装教程
- jQuery慢慢啃筛选(四)
- C#并行和多线程编程
- [google面试CTCI] 1-6.图像旋转问题
- 1000行代码徒手写正则表达式引擎【1】--JAVA中正则表达式的使用
- IDEA 破解_补丁永久_2018.3
- Flask蓝图
- div无法触发blur事件解决办法
- nutch从搜索引擎到网络爬虫
- AngularJS AOP 实例
- SDN2017 第一次实验作业
- UIBarButtonItem
- 获取lambda表达式类型,获取attributes是注意事项
- FluentValidation 模型验证
- Apache无法启动报错查看
- 「GXOI / GZOI2019」逼死强迫症——斐波那契+矩阵快速幂
- CodeForces - 344D Alternating Current (模拟题)