博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 3802Ipad,IPhone
阅读量:4596 次
发布时间:2019-06-09

本文共 1576 字,大约阅读时间需要 5 分钟。

前两块可以看成是不是二次剩余,快速幂计算即可。

后半部分可以看成x1=a+b+2ab,x2=a+b-2ab为特征方程x^2-px-qx=0的两根

然后可以通过韦达定理求出p和q,因此递推式为A(n+2)=pA(n+1)+qA(n)

还要用费马小定理化简一下斐波那契数。

矩阵快速幂即可求。

1 #include
2 using namespace std; 3 typedef long long ll; 4 ll mod; 5 struct Max 6 { 7 ll a[4][4];int n,m; 8 Max(){n=m=0;memset(a,0,sizeof(a));}; 9 Max operator *(const Max &b)const{10 Max c;c.n=n;c.m=b.m;11 for(int k=0;k
>=1;25 }26 return ans;27 }28 Max Qmod(Max a,ll b)29 {30 Max ans;ans.n=a.n;ans.m=a.m;31 ans.a[0][0]=ans.a[1][1]=1;32 while(b)33 {34 if(b&1)ans=ans*a;35 a=a*a;b>>=1;36 }37 return ans;38 }39 ll calc(ll a,ll b,ll n,ll p)40 {41 mod=p-1;42 Max f;f.n=f.m=2;43 f.a[0][0]=1;f.a[0][1]=1;44 f.a[1][0]=1;f.a[1][1]=0;45 f=Qmod(f,n);46 mod=p;47 int k=f.a[0][0];48 Max z;z.n=z.m=2;49 z.a[0][0]=2*(a+b)%mod;z.a[1][0]=-(a-b)*(a-b)%mod;50 z.a[0][1]=1;z.a[1][1]=0;51 z=Qmod(z,k-1);52 Max ans;ans.n=1,ans.m=2;53 ans.a[0][1]=2,ans.a[0][0]=2*(a+b)%mod;54 ans=ans*z;55 return (ans.a[0][0]+mod)%mod;56 }57 int main()58 {59 int T;ll a,b,n,p;60 scanf("%d",&T);61 while(T--)62 {63 scanf("%lld%lld%lld%lld",&a,&b,&n,&p);64 int tmp1=qmod(a,(p-1)/2,p);65 int tmp2=qmod(b,(p-1)/2,p);66 if(tmp1==-1||tmp2==-1)67 {68 puts("0");continue;69 }tmp1++;tmp2++;70 printf("%lld\n",tmp1%p*tmp2%p*calc(a,b,n,p)%p);71 }72 return 0;73 }

 

转载于:https://www.cnblogs.com/nbwzyzngyl/p/8480167.html

你可能感兴趣的文章
html5 Canvas绘制时钟以及绘制运动的圆
查看>>
Unity3D热更新之LuaFramework篇[05]--Lua脚本调用c#以及如何在Lua中使用Dotween
查看>>
JavaScript空判断
查看>>
洛谷 P1439 【模板】最长公共子序列(DP,LIS?)
查看>>
python timeit
查看>>
Wireless Network 并查集
查看>>
51nod 1019 逆序数
查看>>
20145202马超《JAVA》预备作业1
查看>>
台湾好市多概述
查看>>
shell-逐行读取文件
查看>>
贝叶斯如何生效
查看>>
UVA - 1588 - Kickdown
查看>>
Win32 SDK:ListBox 为什么不整个 LB_SETTEXT
查看>>
spring的优缺点
查看>>
优云老王的心路历程(一):那个做了五年的产品经理
查看>>
双态运维分享之:业务场景驱动的服务型CMDB
查看>>
cocos2dx-3.6 触摸,键盘,聚焦事件
查看>>
JEECG中t:dictSelect的extendJson用法
查看>>
web开发下的各种下载方法
查看>>
第六章 堆排序 6.5 优先队列
查看>>