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 3
1 2 10
0 0 0
Sample Output
2
5
题解: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;
}