HDU 4565 - 2013年长沙邀请赛 A-so easy
来源:互联网 发布:知乎员工数量 编辑:程序博客网 时间:2024/04/30 05:00
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4565
看到要多复杂的解法,来写个我自己想的认为比较好理解的
(a+sqrt(b))^n 在展开之后,总可以写成x+y*sqrt(b)的形式,其中x,y均为整数,思考可以发现一个规律,就是x = y*sqrt(b)上取整。所以求出x再乘2就够了。这个东西其实和复数比较类似。
规律证明如下:
可以看到一个约束:(a-1)2<b <a2,也就是说a-1<sqrt(b)<a,那么sqrt(b)上取整等于a
a+sqrt(b)可以写成a+(a-pa),其中0<pa<1,a-pa就是y*sqrt(b)。两个这样子的式子相乘,还是一个可以写成这种形式的式子
(a+(a-pa))*(a'+(a'-pa'))的结果中,x=a*a' + (a-pa)*(a'-pa'), y*sqrt(b) = a*(a'-pa') + a'*(a-pa) = x - pa*pa',也就可以写成 x + (x-px)的形式了。
所以说,a+(a-pa)这种式子相乘之后还可以写成相同的形式,也就等价与x和y*sqrt(b)两部分
代码如下:
#include<stdio.h>#include<string.h>#include<iostream>using namespace std;typedef long long lld;lld a, b, m;struct num{ lld pa, pb; num(lld pa=0, lld pb=0):pa(pa%m), pb(pb%m){} num operator*(const num &B) const{ return num(pa*B.pa + pb*B.pb*b, pa*B.pb + pb*B.pa); } num pow(lld n){ num ans(1, 0); num p = *this; for (; n; n >>= 1){ if (n & 1) ans = ans * p; p = p * p; } return ans; }};int main(){ lld n; while (cin >> a >> b >> n >> m){ num c(a, 1); c = c.pow(n); cout << c.pa * 2 % m << endl; } return 0;}
- HDU 4565 - 2013年长沙邀请赛 A-so easy
- Hdu 4565 So easy! 2013长沙邀请赛
- HDU4565/2013年长沙赛区So easy
- HDU4565-2013年长沙邀请赛A题
- HDU4565 && 2013年长沙邀请赛A题
- HDU4565-2013年长沙邀请赛A题
- HDU 4565 -- So Easy! 数学 && 2013 ACM-ICPC 长沙赛区全国邀请赛 A题
- hdu 4565 So Easy! /2013 ACM-ICPC 长沙赛区全国邀请赛A题 矩阵乘法
- HDU 4565So Easy!2012长沙邀请赛A题(共轭构造+矩阵的快速幂)
- hdu 4565 so easy 线性递推+矩阵乘法+快速幂 2013湖南区域邀请赛
- 2013长沙邀请赛 HDU 4565 So Easy!(矩阵快速幂)
- 【构造共轭函数+矩阵快速幂】HDU 4565 So Easy! (2013 长沙赛区邀请赛)
- HDU 4565 So Easy!(思想+矩阵快速幂)——2013 ACM-ICPC长沙赛区全国邀请赛
- HDU 4565 So Easy!
- hdu 4565 So Easy!
- HDU 4565 So Easy!
- hdu 4565 So Easy!
- HDU 4565 So Easy!
- Java IO读写大文件的几种方式及测试
- socket编程中的超时设置示例详解之三(Perl实现)
- 计算机考研专业基础知识视频教程链接
- 排序算法温习 - 选择排序法
- Android UI开发第一篇——android的九宫格式实现
- HDU 4565 - 2013年长沙邀请赛 A-so easy
- servlet对象通过json返回到前台页面并展示
- 汇编小计1
- 二分图匹配算法总结
- 关于创建线程
- Linux : SUID SGID
- 2013年6月4日 23:18:58
- 杭电1062
- Android UI开发第二篇——多级列表(ExpandableListView)