被虐的体无完肤,

直接给题解地址吧:http://vfleaking.blog.163.com/blog/static/174807634201341721051604/

  1. const maxk=;
  2. type matrix=array[..,..] of int64;
  3. var a:array[..maxk*] of longint;
  4. first,last,b,len:array[..maxk] of longint;
  5. pre:array[..maxk] of longint;
  6. n,k,p,x,y,sum:int64;
  7. i,j:longint;
  8. ans,aa,bb,s:matrix;
  9.  
  10. function ni(x:int64; y:longint):int64;
  11. begin
  12. ni:=;
  13. while y> do
  14. begin
  15. if y mod = then ni:=ni*x mod k;
  16. y:=y div ;
  17. x:=x*x mod k;
  18. end;
  19. end;
  20.  
  21. procedure work;
  22. var i,d,ph:longint;
  23. begin
  24. a[]:=;a[]:=;i:=;
  25. while true do
  26. begin
  27. inc(i);
  28. a[i]:=(a[i-]+a[i-]) mod k;
  29. if first[a[i]]= then first[a[i]]:=i;
  30. if (a[i]=) and (a[i-]=) then break;
  31. end;
  32. d:=k;
  33. ph:=k;
  34. for i:= to trunc(sqrt(k)) do
  35. if d mod i= then
  36. begin
  37. ph:=ph div i*(i-);
  38. while d mod i= do d:=d div i;
  39. end;
  40. if d> then ph:=ph div d*(d-);
  41.  
  42. for i:= to k- do
  43. begin
  44. pre[i]:=ni(i,ph-);
  45. if int64(pre[i])*int64(i) mod k<> then pre[i]:=;
  46. // writeln(pre[i]);
  47. end;
  48. b[]:=;last[]:=;i:=;
  49. while true do
  50. begin
  51. len[i]:=first[pre[b[i]]]-;
  52. if len[i]< then break;
  53. inc(i);
  54. b[i]:=int64(a[len[i-]])*b[i-] mod k;
  55. if last[b[i]]> then break;
  56. last[b[i]]:=i;
  57. end;
  58. aa[,]:=; aa[,]:=; aa[,]:=; aa[,]:=;
  59. bb:=aa; bb[,]:=p-;
  60. end;
  61.  
  62. operator *(a,b:matrix)c:matrix;
  63. var i,j,k:longint;
  64. begin
  65. for i:= to do
  66. for j:= to do
  67. begin
  68. c[i,j]:=;
  69. for k:= to do
  70. c[i,j]:=(c[i,j]+a[i,k]*b[k,j]) mod p;
  71. end;
  72. end;
  73.  
  74. function f(a:matrix;n:int64):matrix;
  75. begin
  76. fillchar(f,sizeof(f),);
  77. f[,]:=;f[,]:=;f[,]:=;
  78. while n> do
  79. begin
  80. if n and = then f:=f*a;
  81. a:=a*a;
  82. n:=n div ;
  83. end;
  84. end;
  85.  
  86. begin
  87. readln(n,k,p);
  88. if n< then
  89. begin
  90. writeln();
  91. exit;
  92. end;
  93. work;
  94. ans[,]:=; ans[,]:=; ans[,]:=;
  95. if n>len[] then
  96. begin
  97. dec(n,len[]+);
  98. ans:=ans*f(aa,len[]-)*bb;
  99. end
  100. else begin
  101. ans:=ans*f(aa,n-);
  102. n:=;
  103. end;
  104. i:=;
  105. while n> do
  106. begin
  107. if (pre[b[i]]=) or (len[i]<) then
  108. begin
  109. ans:=ans*f(aa,n);
  110. n:=;
  111. break;
  112. end;
  113. if last[b[i]]<i then break;
  114. if n>len[i] then
  115. begin
  116. dec(n,len[i]+);
  117. ans:=ans*f(aa,len[i])*bb;
  118. end
  119. else begin
  120. ans:=ans*f(aa,n);
  121. n:=;
  122. end;
  123. inc(i);
  124. end;
  125. if n<> then
  126. begin
  127. j:=i;
  128. sum:=;
  129. fillchar(s,sizeof(s),);
  130. s[,]:=; s[,]:=; s[,]:=;
  131. for i:=last[b[j]] to j- do
  132. begin
  133. inc(sum,len[i]+);
  134. s:=s*f(aa,len[i])*bb;
  135. end;
  136. ans:=ans*f(s,n div sum);
  137. n:=n mod sum;
  138. i:=last[b[j]];
  139. while n> do
  140. begin
  141. if n>len[i] then
  142. begin
  143. ans:=ans*f(aa,len[i])*bb;
  144. dec(n,len[i]+);
  145. end
  146. else begin
  147. ans:=ans*f(aa,n);
  148. n:=;
  149. end;
  150. inc(i);
  151. end;
  152. end;
  153. writeln((ans[,]+ans[,]+ans[,]) mod p);
  154. end.

bzoj2432的更多相关文章

  1. 【BZOJ2432】【NOI2011】兔农(数论,矩阵快速幂)

    [BZOJ2432][NOI2011]兔农(数论,矩阵快速幂) 题面 BZOJ 题解 这题\(75\)分就是送的,我什么都不想写. 先手玩一下,发现每次每次出现\(mod\ K=1\)的数之后 把它减 ...

  2. BZOJ2432 [Noi2011]兔农

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  3. 【bzoj2432】【NOI2011】兔农

    题目描述 农夫栋栋近年收入不景气,正在他发愁如何能多赚点钱时,他听到隔壁的小 朋友在讨论兔子繁殖的问题. 问题是这样的:第一个月初有一对刚出生的小兔子,经过两个月长大后,这 对兔子从第三个月开始,每个 ...

  4. [BZOJ2432][Noi2011]兔农 矩阵乘法+exgcd

    2432: [Noi2011]兔农 Time Limit: 10 Sec  Memory Limit: 256 MB Description 农夫栋栋近年收入不景气,正在他发愁如何能多赚点钱时,他听到 ...

  5. [bzoj2432]兔农

    将每一个重置为0的点作为一段,那么它会导致后面为以x x为开头的斐波拿起数列的东西,那么设这一段是以x为开头,要快速转移到下一段,就可以解决这道题目为了转移,我们要处理出下面的东西:1.求出x关于模k ...

随机推荐

  1. iOS10.0 TabBar Bug(底部同时展示原生和自定义tabBar)-b

    在没有发布iOS10的时候,在任何模拟器测试下效果正常,更新iOS10后,测试出现BUG先放一张bug之前的效果图: 修改前出现的bug 在检查了所有问题之后,最后把问题定位在了原生系统tabBar底 ...

  2. android 开发 获取各种intent (图片、apk文件、excel、pdf等文件)

    public static Intent openFile(String filePath){ File file = new File(filePath); if(!file.exists()) r ...

  3. android studio 中设置apk的版本号

    今天在mainfest.xml中设置版本号为2,(代码获取到的版本号无效) android:versionCode="2" android:versionName="2. ...

  4. IntelliJ IDEA 14 利用JRebel实现热部署 二

    前言:今天下午和一个qq群里讨论JRebel时,忽然得到“自动部署”的奥秘--真有听君一席话,胜读十年书的感悟. 这是此群友的热部署博客:http://blog.csdn.net/martinkey/ ...

  5. 编写一个函数,接受三个string参数,s,oldVal和newVal。使用迭代器及insert和erase函数将s中所有oldVal替换为newVal。测试你的程序,用他替换通用的简写形式,如,将“tho”,将“”“”

    // test14.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include< ...

  6. POJ 3641

    Pseudoprime numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6044   Accepted: 24 ...

  7. 李洪强iOS开发支付集成之微信支付

    iOS开发支付集成之微信支付 微信支付也是需要签名的,也跟支付宝一样,可以在客户端签名,也可以在后台签名(当然,为了安全还是推荐在服务器上做签名,逻辑也比较好理解). 1 - 集成前首先要看看文档 开 ...

  8. CAD导入ArcScene中线被打断 求解决方案

    cad中是这样 但在arcscene里中是这样

  9. 对象的继承关系在数据库中的实现方式和PowerDesigner设计

    原文:对象的继承关系在数据库中的实现方式和PowerDesigner设计 在面向对象的编程中,使用对象的继承是一个非常普遍的做法,但是在关系数据库管理系统RDBMS中,使用的是外键表示实体(表)之间的 ...

  10. windows系统下Python环境的搭建

    1.下载最新的Python版本3.5.0.