题目链接:HDU 4990 Reading comprehension
题目给的一个程序其实就是一个公式:当N=1时 f[n]=1,当n>1时,n为奇数f[n]=2*f[n-1]+1,n为偶数f[n]=2*f[n-1]。
先不取模,计算前十个找规律。得到一个递推公式:f[n]=2*f[n-2]+f[n-1]+1
然后快速幂解决之。
给出一个神奇的网站(找数列通项):http://oeis.org/
AC代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#define ll __int64
struct Matrix
{
ll m[10][10];
};
struct Matrix I,s;
ll n,kmod;
Matrix Mul(Matrix a,Matrix b)
{
Matrix c;
ll i,j,k;
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
c.m[i][j]=0;
for(k=0;k<3;k++)
{
c.m[i][j]+=(a.m[i][k]*b.m[k][j]);
c.m[i][j]%=kmod;
}
}
}
return c;
}
Matrix Quickpow(Matrix a,ll n)
{
Matrix m,b;
m=a,b=I;
while(n)
{
if(n%2)
b=Mul(b,m);
n/=2;
m=Mul(m,m);
}
return b;
}
int main()
{
ll i,j;
ll k,a,b;
while(scanf("%I64d %I64d",&n,&kmod)!=EOF)
{
Matrix ans,p,q;
memset(I.m,0,sizeof I.m);
memset(p.m,0,sizeof p.m);
memset(q.m,0,sizeof q.m);
for(i=0;i<3;i++)
I.m[i][i]=1;
q.m[0][0]=1;
q.m[0][1]=2;
q.m[0][2]=1;
p.m[1][0]=1;
p.m[0][1]=2;
p.m[1][1]=1;
p.m[2][1]=1;
p.m[2][2]=1;
if(n==1)
printf("%I64d\n",1%kmod);
else if(n==2)
printf("%I64d\n",2%kmod);
else
{
ans=Quickpow(p,n-2);
ans=Mul(q,ans);
printf("%I64d\n",ans.m[0][1]%kmod);
}
}
return 0;
}HDU 4990 Reading comprehension (找规律+矩阵快速幂)
原文:http://blog.csdn.net/u012377575/article/details/39124145