您的位置:首页 > 其它

hdu 2855 Fibonacci Check-up

2013-04-14 19:03 302 查看
#include<iostream>
#include<cstdio>
#include<cstring>
#define max_n 2
using namespace std;
struct M
{
int s[max_n][max_n];
};
int mod;
M mul(M a,M b)
{
int i,j,k;
M t;
memset(t.s,0,sizeof(t.s));
for(i=0;i<2;i++)
for(j=0;j<2;j++)
{
for(k=0;k<2;k++)
{
t.s[i][j]=(t.s[i][j]+(a.s[i][k]*b.s[k][j])%mod)%mod;
}
}
return t;
}
M pow(M a,int t)
{
if(t==1)
return a;
else
{
M b=pow(a,t/2);
if(t&1)
return mul(mul(b,b),a);
else
return mul(b,b);
}
}
int main()
{
int t,n;
M a,b;
scanf("%d",&t);
int s1[2][2]={2,1,1,1};
memcpy(a.s,s1,sizeof(s1));
while(t--)
{
scanf("%d%d",&n,&mod);
if(n==0)
{
printf("0\n");
continue;
}
b=pow(a,n);
printf("%d\n",b.s[0][1]);//因为要乘上初始值F(1)=0;F(2)=1.
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: