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 ...
随机推荐
- MySQL查看数据库、表的占用空间大小
SELECT TABLE_NAME,DATA_LENGTH+INDEX_LENGTH,TABLE_ROWS FROM information_schema.tables WHERE TABLE_SCH ...
- iOS--创建uiscrollview
//创建uiscrollview self.PageHeight = self.view.bounds.size.height; self.PageWidth = self.view.bounds.s ...
- (转)pem, cer, p12 and the pains of iOS Push Notifications encryption
转自:http://cloudfields.net/blog/ios-push-notifications-encryption/ The serious pains of setting up a ...
- ETL-Career RoadMap
RoadMap: 1.Tester:sql的单体或批处理测试: 2. Application Developer 2.1 批处理手动工具(如何使用.如何调度批处理.如何生成批处理脚本): 2.2 批处 ...
- Android Game
收起相关游戏 cytus 机械迷城 小小炼狱 deemo 神庙逃离 现代战争4零点行动 植物大战僵尸2中文版 时空幻境 无尽之剑3 超级救火队 迷你冲撞 大战僵尸鸟 侍魂2 flappy bird 混 ...
- php图片上面写文字,输出图片
<?php /* param $image 图象资源 param size 字体大小 param angle 字体输出角度 param showX 输出位置x坐标 param showY 输出位 ...
- Drawable与Bitmap 自定义
Drawable简介 Drawable是Android平下通用的图形对象,它可以装载常用格式的图像,比如GIF.PNG.JPG,当然也支持BMP.相比于View,我们并不需要去考虑如何measure. ...
- wpf-DataTemplate应用
在WPF中,决定数据外观的是DataTemplate,即DataTemplate是数据内容的表现形式,一条数据显示成什么样子,是简单的文本还是直观的图形,就是由DataTemplate决定的.下面通过 ...
- (转)js 正则表达式之test函数讲解
该方法的返回值是布尔值,通过该值可以匹配字符串中是否存在于正则表达式相匹配的结果,如果有匹配内容,返回ture,如果没有匹配内容返回false,该方法常用于判断用户输入数据的合法性,比如检验Email ...
- [c#]asp.net开发微信公众平台(7)前6篇的整体框架demo源码
这里给出的demo是具备整体框架的微信公众平台源码, 所谓demo就是拿过去就可以直接演示使用的东西, 当然不会具备非常详细的具体到业务层面.数据层面的东西, 每个人都可以在此基础上自由发挥, 只 ...