/*
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!的更多相关文章

  1. HDU4565 So Easy! —— 共轭构造、二阶递推数列、矩阵快速幂

    题目链接:https://vjudge.net/problem/HDU-4565 So Easy! Time Limit: 2000/1000 MS (Java/Others)    Memory L ...

  2. 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 ...

  3. HDU4565 So Easy! 矩阵高速幂外加数学

    easy 个屁啊,一点都不easy,题目就是要求公式的值,但是要求公式在最后的取模前的值向上取整.再取模,无脑的先试了高速幂 double  fmod来做,结果发现是有问题的.这题要做肯定得凑整数,凑 ...

  4. 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 ...

  5. 【HDU4565】So Easy!

    [HDU4565]So Easy! 题面 要你求 \[ \lceil (a+\sqrt b)^n \rceil \% m \] 其中\(0<a,m<2^{15},(a-1)^2<b& ...

  6. HDU 4565 So Easy!(公式化简+矩阵)

    转载:http://www.klogk.com/posts/hdu4565/ 这里写的非常好,看看就知道了啊. 题意很easy.a,b,n都是正整数.求 Sn=⌈(a+b√)n⌉%m,(a−1)2&l ...

  7. 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 ...

  8. hdu4565---So Easy!(矩阵)

    Problem Description A sequence Sn is defined as: Where a, b, n, m are positive integers.┌x┐is the ce ...

  9. 【转】Windows下使用libsvm中的grid.py和easy.py进行参数调优

    libsvm中有进行参数调优的工具grid.py和easy.py可以使用,这些工具可以帮助我们选择更好的参数,减少自己参数选优带来的烦扰. 所需工具:libsvm.gnuplot 本机环境:Windo ...

随机推荐

  1. Codeforces Round #281 (Div. 2) C. Vasya and Basketball 排序

    C. Vasya and Basketball   Vasya follows a basketball game and marks the distances from which each te ...

  2. CON1023 明明的计划

    比赛说明 邀请码:a08f 来源:自出 描述:无 难度:NOIP提高组day1 赛时答疑:私信询问 奖励:无 试题列表 赛题 #A:数学题赛题 #B:明明泡妹子赛题 #C:明明去酒店 U5012 数学 ...

  3. Android Back键和Home键的区别

    back键 Android的程序无需刻意的去退出,当你一按下手机的back键的时候,系统会默认调用程序栈中最上层Activity的Destroy()方法来,销毁当前Activity.当此Activit ...

  4. 窗口函数 SELECT - OVER Clause (Transact-SQL)

    https://docs.microsoft.com/en-us/sql/t-sql/queries/select-over-clause-transact-sql Determines the pa ...

  5. VScode常用插件(持续更新)

  6. JS 有趣的eval优化输入验证

    //eval就是计算字符串[可以放任何js代码]里的值 . var str1='12+3'; eval(str1); . var str2='[1,2,3]'; eval(str2[]); .eval ...

  7. html5与css3入门知识点精炼

    <meta name = "keywords" content="…………"/>(网页搜索时要输入的关键字) <meta name = &qu ...

  8. 【Oracle】OGG(Oracle GoldenGate)简介及搭建过程

    GoldenGate公司简介 GoldenGate公司专注于数据同步领域,是实现数据同步技术的领导者.至2007年,在全球35个国家售出超过2000个许可证,客户分布在政府.银行.电信.证券.传媒.医 ...

  9. C++多个文本读取问题

    同时使用两个 ifstream和 freopen 第二个就会失去效用,不知道错在了哪里! 1. 使用freopen打开: bool CPicToolsDlg::readTxt2Seq( std::st ...

  10. css3基础篇一

    CSS3 选择器 选择器 例子 例子描述 CSS .class .intro 选择 class="intro" 的所有元素. 1 #id #firstname 选择 id=&quo ...