Number Sequence||HDU1005

来源:互联网 发布:出售一手国外邮箱数据 编辑:程序博客网 时间:2024/06/08 04:40

link:http://acm.hdu.edu.cn/showproblem.php?pid=1005

Problem Description

A number sequence is defined as follows:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.Given A, B, and n, you are to calculate the value of f(n).

Input

The input consists of multiple test cases. Each test case contains 3 integers A, B and n on a single line (1 <= A, B <= 1000, 1 <= n <= 100,000,000). Three zeros signal the end of input and this test case is not to be processed.

Output

For each test case, print the value of f(n) on a single line.

Sample Input

1 1 31 2 100 0 0

Sample Output

25

题解:KMP的简单运用,把字符数组换成整数数组就行了
AC代码:

#include<cstdio>#include<cmath>#include<cstdlib>#include<cstring>#include<algorithm>#include<iostream>using namespace std;int num[10010];int s[1000100],t[10010];int n,m;void buildNext(){    int i,j;    i=0,j=-1;    num[0]=-1;    while(i<m)    {        if(j==-1||t[i]==t[j])        {            i++,j++;            num[i]=j;        }        else            j=num[j];    }}int kmp(){    int i,j;//  n=strlen(s);//  m=strlen(t);    i=j=0;    while(i<n)    {        if(j==-1||s[i]==t[j])        {            i++,j++;            if(j==m)            {                return i-m+1;            }        }        else            j=num[j];    }    return -1;}int main(){    int T;    char c;    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&n,&m);        int i;        for(i=0;i<n;i++)            scanf("%d",&s[i]);//第一遍忘记改,%s也过了,神奇         for(i=0;i<m;i++)        {            scanf("%d",&t[i]);        }        buildNext();        printf("%d\n",kmp());    }return 0;}