现在的位置: 首页 > 综合 > 正文

NYOJ 427 Number Sequence

2019年02月26日 ⁄ 综合 ⁄ 共 982字 ⁄ 字号 评论关闭

题目链接~~>

                    这题可以找规律也可以用矩阵乘法做。

矩阵解法:

           f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.

           题意:给出一个递推公式,求第N项。

          

然后使用矩阵乘法时间复杂度为log(n)的一个算法

代码:

#include<stdio.h>
struct M
{
    int p[2][2] ; // 范围大的话用 long long
} ;
M mult(M a,M b)//矩阵相乘
{
    int i,j,k ;
    M c ;
    for(i=0 ;i<2 ;i++)
      for(j=0 ;j<2 ;j++)
      {
           c.p[i][j]=0 ;
           for(k=0 ;k<2 ;k++)
           {
               c.p[i][j]=(c.p[i][j]+a.p[i][k]*b.p[k][j]%7)%7 ;
           }
      }
      return  c ;
}
M pow(M a,int k)//快速幂
{
    M b={1,0,0,1} ; //相当于 ans=1 ;
    while(k)
    {
        if(k&1)
           b=mult(b,a) ;
           a=mult(a,a) ;
           k>>=1 ;
    }
    return b ;
}
int main()
{
    int x,y,n ;
    while(scanf("%d%d%d",&x,&y,&n)!=EOF)
    {
        if(!x&&!y&&!n)
                       break ;
        M a={x,y,1,0} ; // M 相当于 int 
        M c=pow(a,n-2) ;
        printf("%d\n",(c.p[0][0]+c.p[0][1])%7) ;
    }
    return 0 ;
}

找规律解法:

                 主要是找寻环节。

#include<stdio.h>
int f[52] ;
int main()
{
    int i,j,a,b,n ;
    f[1]=f[2]=1 ;
    while(scanf("%d %d %d",&a,&b,&n),n)
    {
         for(i=3;i<52;i++)
              f[i]=(a*f[i-1]+b*f[i-2])%7 ;
         if(n<52)     printf("%d\n",f[n]) ;
         else
         {
            int g=0 ;
            for(i=1;i<50;i++) // 找寻环节
              {
                  for(j=i+1;j<51;j++)
                   if(f[i]==f[j]&&f[i+1]==f[j+1])
                    {
                        printf("%d\n",f[(n-i)%(j-i)+i]) ;
                        g=1 ;
                        break ;
                    }
                   if(g)
                             break ;
              }
         }
    }
    return 0;
}

 

抱歉!评论已关闭.