杭电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]);
}
}
...全文
223 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
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
  • 打赏
  • 举报
回复
注意周期和规律

70,022

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧