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 ...
随机推荐
- StoryBoard 设置TabBar SelectImage 和tintColor
如图:StoryBoard 结构是 Tabbar + Navi + ViewController 需求:需要修改TabBar的Image 和SelectImage 设置Image 设置SelectIm ...
- zeptoJS:如何像jQuery一样,让滚动变得优雅?
利用jQuery的animate() 方法,我们很容易实现滚动条的平滑滚动效果: $(function() { $('#top').click( function (e) { $('html, bod ...
- 【C#基础】 读取json某个键值
/// <summary> /// 用JSObject的方法获取json指定第一层某个键的值 /// </summary> /// <param name="j ...
- __device__ __global__ __host__
__device__ 标记的函数从一个在器件中执行的函数呼叫,在器件中执行 __global__ 表示该函数从一个在主机中执行的函数呼叫,在器件中执行 __host__表示在主机中呼叫,在主机中执行的 ...
- swift菜鸟入门视频教程-04-集合类型
本人自己录制的swift菜鸟入门,欢迎大家拍砖,有什么问题能够在这里留言. 主要内容: 数组(Arrays) 字典(Dictionaries) 集合的可变性(Mutability of Collect ...
- mysql分表方法-----MRG_MyISAM引擎分表法
一般来说,当我们的数据库的数据超过了100w记录的时候就应该考虑分表或者分区了,这次我来具体说说分表的一些方法.眼下我所知道的方法都是MYISAM的,INNODB怎样做分表而且保留事务和外键,我还不是 ...
- C++类的const成员函数、默认的构造函数、复制形参调用函数(转)
C++类的const成员函数 double Sales_item::avg_price() const { } const关键字表明这是一个const成员函数,它不可以修改Sales_item类的成员 ...
- Java Web的数据库操作(一)
一.JDBC技术 1.JDBC简介 JDBC是Java程序与数据库系统通信的标准API,它定义在JDK的API中,通过JDBC技术,Java程序可以非常方便地与各种数据库交互,JDBC在Java程序与 ...
- 【iOS开发之静态库、动态库】
什么是库? 库 就是程序代码的集合, 是共享程序代码的一种方式,库一般分两类:开源库和闭源库.github中共享一般是开源库:闭源库分为:静态库和动态库,闭源库不开放源代码,是经过编译的二进制文件,一 ...
- oracle之时间格式的应用
${,""," and rs.count_date >= '"+start_date+"'||' 00:00:00'")} ${,&q ...