NOI2011 兔农
http://www.lydsy.com/JudgeOnline/problem.php?id=2432
感觉是day1中最难的一题,还好出题人很良心,给了75分部分分。
还是跪拜策爷吧~Orz
http://jcvb.is-programmer.com/posts/39528.html
代码奇丑。。。。。。
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>
#include<bitset>
#include<vector>
#include<functional>
#include<deque>
#include<cctype>
#include<climits>
#include<complex>
//#include<bits/stdc++.h>适用于CF,UOJ,但不适用于poj using namespace std; typedef long long LL;
typedef double DB;
typedef pair<int,int> PII;
typedef complex<DB> CP; #define mmst(a,v) memset(a,v,sizeof(a))
#define mmcy(a,b) memcpy(a,b,sizeof(a))
#define re(i,a,b) for(i=a;i<=b;i++)
#define red(i,a,b) for(i=a;i>=b;i--)
#define fi first
#define se second
#define m_p(a,b) make_pair(a,b)
#define SF scanf
#define PF printf
#define two(k) (1<<(k)) template<class T>inline T sqr(T x){return x*x;}
template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;} const DB EPS=1e-;
inline int sgn(DB x){if(abs(x)<EPS)return ;return(x>)?:-;}
const DB Pi=acos(-1.0); inline int gint()
{
int res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
}
inline LL gll()
{
LL res=;bool neg=;char z;
for(z=getchar();z!=EOF && z!='-' && !isdigit(z);z=getchar());
if(z==EOF)return ;
if(z=='-'){neg=;z=getchar();}
for(;z!=EOF && isdigit(z);res=res*+z-'',z=getchar());
return (neg)?-res:res;
} const LL maxK=; LL N,K,P;
LL fib[*maxK+];
LL pos[maxK+];
LL len[maxK+],next[maxK+]; inline LL gcd(LL a,LL b){return b== ? a : gcd(b,a%b); }
inline void extend_gcd(LL a,LL &x,LL b,LL &y)
{
if(b==){x=;y=;return;}
LL dx,dy;
extend_gcd(b,dx,a%b,dy);
x=dy;
y=dx-a/b*dy;
} struct Tmatrix
{
int n,m;
LL v[][];
inline void clear(){n=m=;mmst(v,);}
inline friend Tmatrix operator *(Tmatrix a,Tmatrix b)
{
int i,j,k;
Tmatrix c;c.clear();
c.n=a.n;c.m=b.m;
re(i,,c.n)re(j,,c.m)re(k,,a.m)c.v[i][j]=(c.v[i][j]+a.v[i][k]*b.v[k][j]%P)%P;
return c;
}
}; Tmatrix A,B; inline Tmatrix power(Tmatrix a,LL k)
{
int i;
Tmatrix x,y=a;
x.clear();x.n=x.m=a.n;re(i,,a.n)x.v[i][i]=;
for(;k!=;k>>=){if(k&)x=x*y;y=y*y;}
return x;
} int flag[maxK+]; int main()
{
/*freopen("rabbit.in","r",stdin);
freopen("rabbit.out","w",stdout);*/
LL i;
N=gll();K=gll();P=gll();
fib[]=fib[]=;
for(i=;;i++)
{
fib[i]=(fib[i-]+fib[i-])%K;
if(!pos[fib[i]])pos[fib[i]]=i;
if(fib[i]== && fib[i-]==)break;
}
re(i,,K-)
{
LL x,y;
if(gcd(i,K)==)
{
extend_gcd(i,x,K,y);
x=(x%K+K)%K;
if(pos[x]==)
{
len[i]=-;
next[i]=-;
}
else
{
len[i]=pos[x];
next[i]=i*fib[len[i]-]%K;
}
}
else
len[i]=-,next[i]=-;
}
A.clear();
A.n=A.m=;
A.v[][]=;A.v[][]=;A.v[][]=;
A.v[][]=;A.v[][]=;A.v[][]=;
A.v[][]=;A.v[][]=;A.v[][]=;
B.clear();
B.n=B.m=;
B.v[][]=;B.v[][]=;B.v[][]=-;
B.v[][]=;B.v[][]=;B.v[][]=;
B.v[][]=;B.v[][]=;B.v[][]=; int p,t;
for(p=;!flag[p] && next[p]!=-;flag[p]=,p=next[p]);
if(next[p]!=-)
{
LL lenX=,lenY=;Tmatrix X,Y,Z;
X.clear();X.n=X.m=;X.v[][]=X.v[][]=X.v[][]=;
for(t=;t!=p;t=next[t])X=B*power(A,len[t])*X,lenX+=len[t];
if(N>=lenX)
{
Y.clear();Y.n=Y.m=;Y.v[][]=Y.v[][]=Y.v[][]=;
for(t=p,Y=B*power(A,len[t])*Y,lenY+=len[t],t=next[t];t!=p;t=next[t])Y=B*power(A,len[t])*Y,lenY+=len[t];
Z=power(Y,(N-lenX)/lenY)*X;
N=(N-lenX)%lenY;
for(t=p;;t=next[t])
if(N>=len[t])
{
Z=B*power(A,len[t])*Z;
N-=len[t];
}
else break;
LL y=(Z.v[][]+Z.v[][])%P,x=(Z.v[][]+Z.v[][])%P;
Y.clear();
Y.n=Y.m=;
Y.v[][]=;Y.v[][]=;
Y.v[][]=;Y.v[][]=;
Z=power(Y,N);
LL res=(Z.v[][]*y%P+Z.v[][]*x%P)%P;
cout<<(res%P+P)%P<<endl;
}
else
{
X.clear();X.n=X.m=;X.v[][]=X.v[][]=X.v[][]=;
for(t=;t!=p;t=next[t])
if(N>=len[t])
{
X=B*power(A,len[t])*X;
N-=len[t];
}
else break;
LL y=(X.v[][]+X.v[][])%P,x=(X.v[][]+X.v[][])%P;
Y.clear();
Y.n=Y.m=;
Y.v[][]=;Y.v[][]=;
Y.v[][]=;Y.v[][]=;
Z=power(Y,N);
LL res=(Z.v[][]*y%P+Z.v[][]*x%P)%P;
cout<<(res%P+P)%P<<endl;
}
}
else
{
LL lenX=;Tmatrix X,Y,Z;
X.clear();X.n=X.m=;X.v[][]=X.v[][]=X.v[][]=;
for(t=;t!=p;t=next[t])X=B*power(A,len[t])*X,lenX+=len[t];
if(N>=lenX)
{
LL y=(X.v[][]+X.v[][])%P,x=(X.v[][]+X.v[][])%P;
N-=lenX;
Y.clear();
Y.n=Y.m=;
Y.v[][]=;Y.v[][]=;
Y.v[][]=;Y.v[][]=;
Z=power(Y,N);
LL res=(Z.v[][]*y%P+Z.v[][]*x%P)%P;
cout<<(res%P+P)%P<<endl;
}
else
{
X.clear();X.n=X.m=;X.v[][]=X.v[][]=X.v[][]=;
for(t=;t!=p;t=next[t])
if(N>=len[t])
{
X=B*power(A,len[t])*X;
N-=len[t];
}
else break;
LL y=(X.v[][]+X.v[][])%P,x=(X.v[][]+X.v[][])%P;
Y.n=Y.m=;
Y.v[][]=;Y.v[][]=;
Y.v[][]=;Y.v[][]=;
Z=power(Y,N);
LL res=(Z.v[][]*y%P+Z.v[][]*x%P)%P;
cout<<(res%P+P)%P<<endl;
}
}
return ;
}
NOI2011 兔农的更多相关文章
- [BZOJ2432][Noi2011]兔农 矩阵乘法+exgcd
2432: [Noi2011]兔农 Time Limit: 10 Sec Memory Limit: 256 MB Description 农夫栋栋近年收入不景气,正在他发愁如何能多赚点钱时,他听到 ...
- BZOJ2432 [Noi2011]兔农
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- 2432: [Noi2011]兔农 - BZOJ
Description 农夫栋栋近年收入不景气,正在他发愁如何能多赚点钱时,他听到隔壁的小朋友在讨论兔子繁殖的问题. 问题是这样的:第一个月初有一对刚出生的小兔子,经过两个月长大后,这对兔子从第三个月 ...
- 【BZOJ 2432】 [Noi2011]兔农 矩乘+数论
这道题的暴力分还是很良心嘛~~~~~ 直接刚的话我发现本蒟蒻只会暴力,矩乘根本写不出来,然后让我们找一下规律,我们发现如果我们把这个序列在mod k的意义下摆出,并且在此过程中把值为1的的数减一,我们 ...
- 【BZOJ2432】【NOI2011】兔农(数论,矩阵快速幂)
[BZOJ2432][NOI2011]兔农(数论,矩阵快速幂) 题面 BZOJ 题解 这题\(75\)分就是送的,我什么都不想写. 先手玩一下,发现每次每次出现\(mod\ K=1\)的数之后 把它减 ...
- 【BZOJ 2437】 2437: [Noi2011]兔兔与蛋蛋 (博弈+二分图匹配**)
未经博主同意不得转载 2437: [Noi2011]兔兔与蛋蛋 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 693 Solved: 442 Des ...
- bzoj 2437[Noi2011]兔兔与蛋蛋 黑白染色二分图+博弈+匈牙利新姿势
noi2011 兔兔与蛋蛋 题目大意 直接看原题吧 就是\(n*m\)的格子上有一些白棋和一些黑棋和唯一一个空格 兔兔先手,蛋蛋后手 兔兔要把与空格相邻的其中一个白棋移到空格里 蛋蛋要把与空格相邻的其 ...
- 【bzoj2432】【NOI2011】兔农
题目描述 农夫栋栋近年收入不景气,正在他发愁如何能多赚点钱时,他听到隔壁的小 朋友在讨论兔子繁殖的问题. 问题是这样的:第一个月初有一对刚出生的小兔子,经过两个月长大后,这 对兔子从第三个月开始,每个 ...
- 【NOI2011】兔农(循环节)
我居然没看题解瞎搞出来了? 题解: 不难想到找到每次减1的位置,然后减去它对最终答案的贡献. 假设有一个地方是\(x,1(mod~k)\) 那么减了1后就变成了\(x,0\). 然后可以推到\(x,0 ...
随机推荐
- jetty插件配置
1.jetty maven 插件启动设置: Base directory:${project_loc} Goals:clean -Djetty.port=8080 jetty:run 2.jetty ...
- (转)Maven实战(一)安装与配置
1. 简介 Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具. 如果你已经有十次输入同样的Ant targets来编译你的代码.jar或者w ...
- 程序猿的道路~~(How to be a programmer?)
程序猿的道路其实很简单,主要就是三条: Learn (学习), Practice(练习), Summary(总结) 推荐给新手程序猿两篇文章: 给程序员新手的一些建议 程序员技术练级攻略 当然了,整个 ...
- Android Game
收起相关游戏 cytus 机械迷城 小小炼狱 deemo 神庙逃离 现代战争4零点行动 植物大战僵尸2中文版 时空幻境 无尽之剑3 超级救火队 迷你冲撞 大战僵尸鸟 侍魂2 flappy bird 混 ...
- VC用OLE方式读写Excel
前几天要做一个项目,需要读取Excel中的数据.从网上查资料发现,主要是有两种方式.一是把Excel表当成数据库使用ODBC读写,这样操作起来就跟操作Access数据库似的.但这种方式效率比较低.另一 ...
- [React] React Router: Router, Route, and Link
In this lesson we'll take our first look at the most common components available to us in react-rout ...
- <a>标签中href="javascript:;"
javascript: 是一个伪协议,其他的伪协议还有 mail: tel: file: 等等. 1 <a id="jsPswEdit" class="set ...
- 开发日志_Jan.9
今天主要工作为修改昨天的碰撞引擎不符合预期的部分. 经过了昨天的工作,碰撞算法已经初见雏形.但是主要有两个问题: 碰撞反弹的方向与预期不符合 碰撞后球与机器人存在一个"黏在一起"的 ...
- C# typeof Gettype is as &拆箱 装箱
有时候,我们不想用值类型的值,就是想用一个引用..Net提供了一个名为装箱(boxing)的机制,它允许根据值类型来创建一个对象,然后使用对这个新对象的一个引用. 首先,回顾两个重要的事实,1.对于引 ...
- 1.Android Studio系列教程1——下载和安装
链接:http://stormzhang.com/devtools/2014/11/25/android-studio-tutorial1/ 一.Android Studio优点 1.Google推出 ...