HDU4565 So Easy!
/*
HDU4565 So Easy!
http://acm.hdu.edu.cn/showproblem.php?pid=4565
数论 快速幂 矩阵快速幂
题意:求[(a+sqrt(b))^n ]%m [ ]代表向上取证
联想到斐波那契数列,所以第一感觉是矩阵快速幂
后来发现根本不用这么麻烦,我们认为a+b*sqrt(c)中的a为实部
b为虚部,就能直接用二元乘法模拟矩阵快速幂了,因此这两种方法
是等价的。于是乎,我们就解决了精度问题。
然而即使我们得出了结果中的a+b*sqrt(c)也不能这么算
因为[b*sqrt(c)]%m不和[b%m*sqrt(c)]%m同余,因此只能另辟蹊径。
注意到题目中的(a-1)^2< b < a^2 <=> 0<a-sqrt(b)<1
所以 0<(a+sqrt(b))^n<1 而 (a+sqrt(b))^n与(a-sqrt(b))^n是公轭的
所以其和只剩下了实部的二倍。因此只需求出实部,将其乘以2就是答案。
*/
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <iostream>
#include <map>
#include <set>
#define test
using namespace std;
const int Nmax=;
//const long long mod=2147483647LL;
//double eps=1e-8;
long long a,b,n,m;
struct Num
{
long long a;
long long b;
long long c;
Num(long long _a,long long _b,long long _c)
{
a=_a;
b=_b;
c=_c;
}
friend Num operator * (Num x,Num y)
{
long long a1=x.a%m,b1=x.b%m,a2=y.a%m,b2=y.b%m,c=x.c;
long long a=(a1*a2%m+((c*b1*b2)%m))%m;
long long b=((a1*b2)%m+((b1*a2)%m))%m;
return Num(a,b,c);
}
friend Num qpow(Num base,long long n)
{
Num ans(1LL,0LL,base.c);
//ans.print();
while(n>0LL)
{
if(n&1LL)
ans=ans*base;
base=base*base;
n>>=;
//ans.print();
}
//printf("%lld %lld %lld\n",ans.a,ans.b,ans.c);
return ans;
}
void print()
{
printf("a:%lld b:%lld c:%lld\n",a,b,c);
}
}; void work()
{
Num base(a,1LL,b);
Num ans=qpow(base,n);
//ans.print();
long long a=ans.a,b=ans.b,c=ans.c;
//long long res=(long long)ceil(a+b*sqrt(c));//不能这么写,因为整数和小数直接不能模
//while(a<=0)
//a+=m;
//while(b<=0)
//b+=m;
//ans.print();
//long long res=(long long)ceil(a+b*sqrt(c));
//printf("res:%lld\n",res);
//res=res%m;
//printf("%lld %lld %ll\n",a,b);
//ans.print();
//if(2LL*a!=ceil(a+b*sqrt(c)))
//printf("NO\n");
//res=(2LL*a)%m;
//printf("ans:%lld myans:%lld\n",(2LL*a)%m,(long long)ceil(a+b*sqrt(c))%m);
long long res=2LL*a%m;
printf("%lld\n",res); }
int main()
{
#ifdef test
//freopen("hdu4565.in","r",stdin);
#endif
while(scanf("%lld%lld%lld%lld",&a,&b,&n,&m)==)
work();
return ;
}
HDU4565 So Easy!的更多相关文章
- HDU4565 So Easy! —— 共轭构造、二阶递推数列、矩阵快速幂
题目链接:https://vjudge.net/problem/HDU-4565 So Easy! Time Limit: 2000/1000 MS (Java/Others) Memory L ...
- hdu4565 So Easy! 矩阵快速幂
A sequence Sn is defined as: Where a, b, n, m are positive integers.┌x┐is the ceil of x. For example ...
- HDU4565 So Easy! 矩阵高速幂外加数学
easy 个屁啊,一点都不easy,题目就是要求公式的值,但是要求公式在最后的取模前的值向上取整.再取模,无脑的先试了高速幂 double fmod来做,结果发现是有问题的.这题要做肯定得凑整数,凑 ...
- hdu4565 So Easy!(矩阵快速幂)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4565 题解:(a+√b)^n=xn+yn*√b,(a-√b)^n=xn-yn*√b, (a+√b)^n ...
- 【HDU4565】So Easy!
[HDU4565]So Easy! 题面 要你求 \[ \lceil (a+\sqrt b)^n \rceil \% m \] 其中\(0<a,m<2^{15},(a-1)^2<b& ...
- HDU 4565 So Easy!(公式化简+矩阵)
转载:http://www.klogk.com/posts/hdu4565/ 这里写的非常好,看看就知道了啊. 题意很easy.a,b,n都是正整数.求 Sn=⌈(a+b√)n⌉%m,(a−1)2&l ...
- HDU 4565 So Easy!(数学+矩阵快速幂)(2013 ACM-ICPC长沙赛区全国邀请赛)
Problem Description A sequence Sn is defined as:Where a, b, n, m are positive integers.┌x┐is the cei ...
- hdu4565---So Easy!(矩阵)
Problem Description A sequence Sn is defined as: Where a, b, n, m are positive integers.┌x┐is the ce ...
- 【转】Windows下使用libsvm中的grid.py和easy.py进行参数调优
libsvm中有进行参数调优的工具grid.py和easy.py可以使用,这些工具可以帮助我们选择更好的参数,减少自己参数选优带来的烦扰. 所需工具:libsvm.gnuplot 本机环境:Windo ...
随机推荐
- WPF学习笔记——在“System.Windows.StaticResourceExtension”上提供值时引发了异常
在"System.Windows.StaticResourceExtension"上提供值时引发了异常 因应需要,写了一个转换器,然后窗体上引用,结果就出来这个错.编译的时候没事, ...
- hdu1704——floyd
Problem Description there are N ACMers in HDU team.ZJPCPC Sunny Cup 2007 is coming, and lcy want to ...
- (Go)07.Go语言中strings和strconv包示例代码详解02
1.strings使用 统计字符串出现次数 strings.Count(s string, substr string) int Count 用于计算字符串 substr 在字符串 s 中出现的非重叠 ...
- netty支持SSL,OpenSSL
import io.netty.channel.Channel; import io.netty.channel.ChannelInitializer; import io.netty.handler ...
- LeetCode Weekly Contest 28
1. 551. Student Attendance Record I 2. 552. Student Attendance Record II hihocode原题,https://hihocode ...
- 画板(适用于手机、PC端)
Html代码 <script type="text/javascript" src="jquery-1.9.1.min.js"></scrip ...
- U - Three displays
Problem description It is the middle of 2018 and Maria Stepanovna, who lives outside Krasnokamensk ( ...
- jar 包中文乱码注释显示问题解决方案
通过maven下载源代码,直接通过eclipse浏览源代码时,发现中文注释为乱码的问题.其实这个eclipse默认编码造成的问题.可以通过以下方法解决: 修改Eclipse中文本文件的默认编码:win ...
- radis多个盘并发IO
IO就是对磁盘的读/写. 一次IO,就是发出指令+执行命令. 磁盘IO的时间=寻道时间+数据传输时间 单盘不能并发IO. radis多个盘并发IO. 影响IO的最大因素是寻道时间. 影响电脑速度:cp ...
- 讲究地使用 List
本篇旨意在于讨论List的基本用法,不做全面讲解,仅仅涉及构造函数List.Add.RemoveAt 先看看这几个函数的代码 1.构造函数 static readonly T[] _emptyArra ...