杭电ACM1005 Number Sequence

会打代码的扫地王大爷 学生  2014-02-09 11:58:48
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日
引用 7 楼 angel_su 的回复:
虽然ac,感觉if (a[i]==1 && a[i-1]==1) break武断认为开头就是循环的起始点,譬如ab都是7的倍数,第三项以后都为0,跟开头2项无关...
说明那oj上的数据弱……
回复 点赞
angel_su 2014年02月11日
虽然ac,感觉if (a[i]==1 && a[i-1]==1) break武断认为开头就是循环的起始点,譬如ab都是7的倍数,第三项以后都为0,跟开头2项无关...
回复 点赞
logiciel 2014年02月11日
如下修改AC:
#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; //加
}
回复 点赞
孩皮妞野 2014年02月10日
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的时候及其容易,剩下要保存的数据实在不多。
回复 点赞
孩皮妞野 2014年02月10日
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才怪。
回复 点赞
buyong 2014年02月10日
about algorithm
回复 点赞
u012723504 2014年02月09日
注意周期和规律
回复 点赞
发动态
发帖子
C语言
创建于2007-09-28

3.2w+

社区成员

24.0w+

社区内容

C语言相关问题讨论
社区公告
暂无公告