被虐的体无完肤,

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

 const maxk=;
type matrix=array[..,..] of int64;
var a:array[..maxk*] of longint;
first,last,b,len:array[..maxk] of longint;
pre:array[..maxk] of longint;
n,k,p,x,y,sum:int64;
i,j:longint;
ans,aa,bb,s:matrix; function ni(x:int64; y:longint):int64;
begin
ni:=;
while y> do
begin
if y mod = then ni:=ni*x mod k;
y:=y div ;
x:=x*x mod k;
end;
end; procedure work;
var i,d,ph:longint;
begin
a[]:=;a[]:=;i:=;
while true do
begin
inc(i);
a[i]:=(a[i-]+a[i-]) mod k;
if first[a[i]]= then first[a[i]]:=i;
if (a[i]=) and (a[i-]=) then break;
end;
d:=k;
ph:=k;
for i:= to trunc(sqrt(k)) do
if d mod i= then
begin
ph:=ph div i*(i-);
while d mod i= do d:=d div i;
end;
if d> then ph:=ph div d*(d-); for i:= to k- do
begin
pre[i]:=ni(i,ph-);
if int64(pre[i])*int64(i) mod k<> then pre[i]:=;
// writeln(pre[i]);
end;
b[]:=;last[]:=;i:=;
while true do
begin
len[i]:=first[pre[b[i]]]-;
if len[i]< then break;
inc(i);
b[i]:=int64(a[len[i-]])*b[i-] mod k;
if last[b[i]]> then break;
last[b[i]]:=i;
end;
aa[,]:=; aa[,]:=; aa[,]:=; aa[,]:=;
bb:=aa; bb[,]:=p-;
end; operator *(a,b:matrix)c:matrix;
var i,j,k:longint;
begin
for i:= to do
for j:= to do
begin
c[i,j]:=;
for k:= to do
c[i,j]:=(c[i,j]+a[i,k]*b[k,j]) mod p;
end;
end; function f(a:matrix;n:int64):matrix;
begin
fillchar(f,sizeof(f),);
f[,]:=;f[,]:=;f[,]:=;
while n> do
begin
if n and = then f:=f*a;
a:=a*a;
n:=n div ;
end;
end; begin
readln(n,k,p);
if n< then
begin
writeln();
exit;
end;
work;
ans[,]:=; ans[,]:=; ans[,]:=;
if n>len[] then
begin
dec(n,len[]+);
ans:=ans*f(aa,len[]-)*bb;
end
else begin
ans:=ans*f(aa,n-);
n:=;
end;
i:=;
while n> do
begin
if (pre[b[i]]=) or (len[i]<) then
begin
ans:=ans*f(aa,n);
n:=;
break;
end;
if last[b[i]]<i then break;
if n>len[i] then
begin
dec(n,len[i]+);
ans:=ans*f(aa,len[i])*bb;
end
else begin
ans:=ans*f(aa,n);
n:=;
end;
inc(i);
end;
if n<> then
begin
j:=i;
sum:=;
fillchar(s,sizeof(s),);
s[,]:=; s[,]:=; s[,]:=;
for i:=last[b[j]] to j- do
begin
inc(sum,len[i]+);
s:=s*f(aa,len[i])*bb;
end;
ans:=ans*f(s,n div sum);
n:=n mod sum;
i:=last[b[j]];
while n> do
begin
if n>len[i] then
begin
ans:=ans*f(aa,len[i])*bb;
dec(n,len[i]+);
end
else begin
ans:=ans*f(aa,n);
n:=;
end;
inc(i);
end;
end;
writeln((ans[,]+ans[,]+ans[,]) mod p);
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. 怎样开启SQL数据库服务

    使用数据库时开启服务是需要的,我给大家具体介绍几种方式开启SQL Sever 服务.这几种我都用图文的形式用三个开启方式给你展示,对于不会开启服务的朋友可以学习下,这些前提是你的电脑安装了SQL数据库 ...

  2. libreoffice转换文档的方法(支持各平台各版本的libreoffice)

    前段时间完成了一个利用libreoffice转换文档进行预览的资源管理系统,用的是jodconvert这个多年未更新的转换项目,由于版本不兼容等原因,导致最新版的libreoffice不能用,浪费了许 ...

  3. word小技巧

    如何将英文和数字替换为times new romans 1,点击替换(ctrl+H) .2,在查找内容中输入”([A-Z0-9])“(不包括引号,但包括小括号),这是替换所有大写字母和数字,如果还想替 ...

  4. 修改tomcat 启动45秒

    当我们需要增加Tomcat的启动时间,修改方法如下:

  5. Unity3D与iOS的交互设计<ViewController 的跳转>

    原地址:http://www.aichengxu.com/article/%CF%B5%CD%B3%D3%C5%BB%AF/28797_12.html Unity3D与iOS的交互设计<View ...

  6. javascript 比较

    javascript中由于是弱类型,所以在比较的时候有较大的麻烦.这次专门做了总结: Comparison Operators Comparison operators are used in log ...

  7. 1. what is Lua?

    glue language Lua is a proven, robust language, small.

  8. Mutex vs Semaphore

    What are the differences between Mutex vs Semaphore? When to use mutex and when to use semaphore? Co ...

  9. HDU 1102 Constructing Roads(最小生成树,基础题)

    注意标号要减一才为下标,还有已建设的路长可置为0 题目 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include<str ...

  10. 小米2S 连接Ubuntu Android Studio

    1. 首先打开手机上的开发者选项,USB调试.拨号:*#*#717717#*#*  ,手机会以Toast形式出现“……enable”字样.再次拨号可disable. 2. Ubuntu安装mtpfs: ...