NYOJ 427 Number Sequence
来源:互联网 发布:知柏地黄丸配方 编辑:程序博客网 时间:2024/06/01 07:34
题目链接~~>
这题可以找规律也可以用矩阵乘法做。
矩阵解法:
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;}
- NYOJ 427 Number Sequence
- NYOJ 427 & HDU 1005 Number Sequence(找循环节)
- NYOJ 427 & HDU 1005 Number Sequence(找循环节)
- NYOJ 413 && POJ 1019 Number Sequence(模拟)
- Number Sequence
- Number Sequence
- Number Sequence
- Number Sequence
- Number Sequence
- Number Sequence
- Number Sequence
- Number Sequence
- Number Sequence
- Number Sequence
- Number Sequence
- Number Sequence
- Number Sequence
- Number Sequence
- Intent数据传递
- 简单试用版的——双击运行破解QTP——源代码
- oracle11g常用服务详解
- [Happy DSA] 删除单链表中任意一个节点的方法
- rsync server client配置
- NYOJ 427 Number Sequence
- frameset编码问题
- 话说程序员的责任心
- C语言 - 本人编写的一个小白控制台程序,只是为了分享。
- [Python下载CSDN博客]1. 简单实现(二)
- 算法导论 5.2-1 5.2-2
- 移植ubuntu core到Arm开发板
- MT6572平台加入呼吸灯功能——编写APP Demo
- HDU 1787 欧拉函数