当前位置:编程学习 > C/C++ >>

HDU 1005 Number Sequence

思路:快速幂乘+矩阵乘法
是个不错的矩阵乘法练手的题目^0^...
其中有:
|  f(1)  f(2) |      |   0   B  |^(n-1)             |   f(n)        f(n+1)   |
|                |  *  |             |               =     |                            |
|  f(2)  f(3) |      |   1   A  |                       |    f(n+1)   f(n+2)  |

(图片没传上,这个将就一下吧)

[cpp] 
#include<iostream> 
#include<cstdio> 
using namespace std; 
struct Matrix 

  int row[2][2]; 
}; 
Matrix num,rex,ans; 
int a,b,n; 
void Init() 

   num.row[0][0]=0;rex.row[0][0]=1; 
   num.row[0][1]=b;rex.row[0][1]=1; 
   num.row[1][0]=1;rex.row[1][0]=1; 
   num.row[1][1]=a;rex.row[1][1]=(a+b)%7; 
 

 
Matrix MatrixMul(Matrix t1,Matrix t2) 

  Matrix sum; 
  int i,j; 
  for(i=0;i<2;i++) 
      for(j=0;j<2;j++) 
          sum.row[i][j]=(t1.row[i][0]*t2.row[0][j]+t1.row[i][1]*t2.row[1][j])%7; 
  return sum; 

 
void Getdata(int teams) 

      ans=num; 
      while(teams) 
      { 
      if(teams&1) rex=MatrixMul(rex,ans); 
      ans=MatrixMul(ans,ans); 
      teams>>=1; 
      }   

 
int main() 

   while(scanf("%d%d%d",&a,&b,&n)!=EOF&&(a||b||n)) 
   { 
      Init(); 
      Getdata(--n); 
      printf("%d\n",rex.row[0][0]); 
   } 
   return 0; 


此外还一些小技巧也可以解决AC它
1。由题目的式子可知0<=f[n]<=6,
2。而每个f[n]又是由(f[n-1],f[n-2])这个组合通过计算得出来的,
由以上两点可以推出,(f[n-1],f[n-2])出现重复的组合的最大周期为7*7=49, 即f[n]的最大周期
所有, 我们只要算出一个周期中所有的f[n]的值并记录下周期i即可.
下面给出别人的代码以供参考:

[cpp] 
#include<stdio.h> 
int main() 

    int a,b,n,i,f[53]; 
    while(scanf("%d%d%d",&a,&b,&n)!=EOF) 
    { 
        if(a==0 && b==0 && n==0) 
            break; 
        if(n==1 || n==2) 
        { 
            puts("1"); 
            continue; 
        } 
        f[1]=1,f[2]=1; 
        a%=7,b%=7; 
        for(i=3;i<=52;i++) 
        { 
            f[i]=(a*f[i-1]+b*f[i-2])%7; 
            if(f[i-1]==1 && f[i]==1) 
                break; 
        } 
        i-=2; 
        n%=i; 
        f[0]=f[i]; 
        printf("%d/n",f[n]); 
    } 
    return 0; 

补充:软件开发 , C++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,