• 主页

# 杭电ACM1005 Number Sequence

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

#include<stdio.h>
int main(void)
{
__int64 a[100000];
int A,B,n,i;
while(scanf("%d%d%d",&A,&B,&n)!=EOF&&!(A==0&&B==0&&n==0))
{
a[1]=1;a[2]=1;
for(i=3;i<=n;i++)
a[i] = (A * a[i - 1] + B * a[i - 2])%7;
printf("%I64d\n",a[n]);
}
}
...全文
159 点赞 收藏 8

8 条回复
FancyMouse 2014年02月12日

angel_su 2014年02月11日

logiciel 2014年02月11日

#include<stdio.h>
int main(void)
{
int a[101];//改 __int64 a[100000];
int A,B,n,i;
while(scanf("%d%d%d",&A,&B,&n)!=EOF&&!(A==0&&B==0&&n==0))
{
a[1]=1;a[2]=1;
if (n>=3) //加
{
for(i=3;i<100;i++) //改 for(i=3;i<=n;i++)
{
a[i] = (A * a[i - 1] + B * a[i - 2])%7;
if (a[i]==1 && a[i-1]==1) break; //加
}
i-=2; //加
n%=i; //加
if (n==0) n=i; //加
}
printf("%d\n",a[n]);//改 printf("%I64d\n",a[n]);
}
return 0; //加
}

f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. =(A MOD 7 * f(n-1) MOD 7+B MOD 7 * f(n-2)) MOD 7, 一个起点，36（6x6)种组合, 找出周期率，把数据写在程序里面，常数时间可解。 研究程序:

#include <vector>
#include <iostream>

using namespace std;

void span(vector<int>& vi, int a, int b);

int main()
{
for(int a=1; a<7; ++a)
for(int b=1; b<7; ++b)
{

vector<int> vi;
span(vi,a,b);
cout<<'('<<a<<','<<b<<')';
for(auto i:vi)
cout<<' '<<i;
cout<<endl;
}
}

void span(vector<int>& vi, int a, int b)
{
vi.push_back(1);
vi.push_back(1);
while(true)
{
vi.push_back((a*vi[vi.size()-2]+b*vi[vi.size()-1])%7);
if(vi[vi.size()-2]==vi[0] && vi[vi.size()-1]==vi[1])
{
vi.pop_back();
vi.pop_back();
break;
}
}

}

(1,1) 1 1 2 3 5 1 6 0 6 6 5 4 2 6 1 0
(1,2) 1 1 3 0 3 6
(1,3) 1 1 4 6 1 2 0 2 6 6 3 1 6 5 0 5
(1,4) 1 1 5 0 5 6 1 3 6 6 2 0 2 1 6 4
(1,5) 1 1 6 3 0 3
(1,6) 1 1 0 1 6 2 4 5 6 6 0 6 1 5 3 2
(2,1) 1 1 3 5 4 0
(2,2) 1 1 4 3 0 6 5 1 5 5 6 1 0 2 4 5 4 4 2 5 0 3 6 4 6 6 3 4 0 1 2 6 2 2 1 6 0 5 3 2 3 3 5 2 0 4 1 3
(2,3) 1 1 5 3 5 0 3 2 5 5 4 1 4 0 1 3 4 4 6 5 6 0 5 1 6 6 2 4 2 0 4 5 2 2 3 6 3 0 6 4 3 3 1 2 1 0 2 6
(2,4) 1 1 6 5 4 5 0 3 5 5 2 4 6 4 0 1 4 4 3 6 2 6 0 5 6 6 1 2 3 2 0 4 2 2 5 3 1 3 0 6 3 3 4 1 5 1 0 2
(2,5) 1 1 0 2 3 5 3 4 5 5 0 3 1 4 1 6 4 4 0 1 5 6 5 2 6 6 0 5 4 2 4 3 2 2 0 4 6 3 6 1 3 3 0 6 2 1 2 5
(2,6) 1
(3,1) 1 1 4 0 5 5 6 0 4 4 2 0 6 6 3 0 2 2 1 0 3 3 5 0
(3,2) 1 1 5 6 6 2
(3,3) 1 1 6 0 4 5 6 5 5 2 0 6 4 2 4 4 3 0 2 6 3 6 6 1 0 3 2 1 2 2 5 0 1 3 5 3 3 4 0 5 1 4
(3,4) 1 1 0 3 5 1 5 2 2 0 6 3 2 3 4 4 0 5 6 4 6
(3,5) 1
(3,6) 1 1 2 1 5 5 3 5 4 4 1 4 6 6 5 6 2 2 4 2 3 3 6 3
(4,1) 1 1 5 2 1 2 6 0 3 3 1 6 3 6 4 0 2 2 3 4 2 4 5 0 6 6 2 5 6 5 1 0 4 4 6 1 4 1 3 0 5 5 4 3 5 3 2 0
(4,2) 1 1 6 2 0 1 2 1 3 3 4 6 0 3 6 3 2 2 5 4 0 2 4 2 6 6 1 5 0 6 5 6 4 4 3 1 0 4 1 4 5 5 2 3 0 5 3 5
(4,3) 1 1 0 4 5 3
(4,4) 1
(4,5) 1 1 2 0 1 5 1 4 3 3 6 0 3 1 3 5 2 2 4 0 2 3 2 1 6 6 5 0 6 2 6 3 4 4 1 0 4 6 4 2 5 5 3 0 5 4 5 6
(4,6) 1 1 3 1 4 0 2 5 3 3 2 3 5 0 6 1 2 2 6 2 1 0 4 3 6 6 4 6 3 0 5 2 4 4 5 4 2 0 1 6 5 5 1 5 6 0 3 4
(5,1) 1 1 6 4 6 5 0 4 4 3 2 3 6 0 2 2 5 1 5 3 0
(5,2) 1 1 0 5 3 3 0 1 2 2 0 3 6 6 0 2 4 4 0 6 5 5 0 4
(5,3) 1
(5,4) 1 1 2 6 6 5
(5,5) 1 1 3 6 3 3 2 4 2 2 6 5 6 6 4 1 4 4 5 3 5 5 1 2
(5,6) 1 1 4 1 5 0 4 3 3 5 3 1 0 5 2 2 1 2 3 0 1 6 6 3 6 2 0 3 4 4 2 4 6 0 2 5 5 6 5 4 0 6
(6,1) 1 1 0 6 6 0
(6,2) 1
(6,3) 1 1 2 5 6 6 5 2
(6,4) 1 1 3 4 6 6 4 3
(6,5) 1 1 4 5 0 2 3 6 6 3 2 0 5 4
(6,6) 1 1 5
a+b=8的时候及其容易，剩下要保存的数据实在不多。

f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. =A MOD 7 * f(n-1) MOD 7+B MOD 7 * f(n-2), 一个起点，49（7x7)种组合,其中若一个为0的是trival的，剩下的36种，找出周期率，把数据写在程序里面，常数时间可解。

FancyMouse 2014年02月10日
n这么大，你这么做不TLE才怪。

u012723504 2014年02月09日

C语言

3.2w+

24.0w+

C语言相关问题讨论