一道简单的编程题 但是通不过

sunyuke 2009-02-26 08:49:42
这是HDU上的第1005题

f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) % 7.
Given A, B, and n, you are to calculate the value of f(n).


我用穷举得到f(n)的循环表
但是提交的时候老是wrong answer

#include <iostream>
using namespace std;
int main()
{
int A,B;
long n;
int a[300] = {0};
a[1] = 1;
a[2] = 1;
while(cin>>A>>B>>n)
{
if(A + B + n == 0)
break;
if(n > 2)
{
int i = 3;
for(;i<300;i++)
{
a[i] = (A*a[i-1] +B*a[i-2])%7;
if(a[i] == 1)
if(a[i-1] == 1)
break;
}
i -= 2;
cout<<a[(n-1)% i + 1]<<endl;
}
else
cout<<"1"<<endl;
}
return 0;
}


请问高手 为什么会这样
还有下面的c代码跟我的算法一模一样 实现细节也一样 它却通过了

#include<stdio.h>
int main()
{
int a,b,i;
long n,f[201];
while (scanf("%d %d %ld",&a,&b,&n)!=EOF)
{
if(a==0 && b==0 && n==0)
break;
f[1]=1;
f[2]=1;
if(n>=3)
{
for(i=3;i<200;i++)
{
f[i]=(a*f[i-1]+b*f[i-2])%7;
if(f[i-1]==1 && f[i]==1)
break;
}
i=i-2;
n=n%i;
if(n==0)
n=i;
printf("%d\n",f[n]);
}
else
printf("1\n");
}
return 0;
}
...全文
782 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
digiman 2009-10-10
  • 打赏
  • 举报
回复
这些在实际中都用不上~~
passionboy03 2009-03-26
  • 打赏
  • 举报
回复
太占资源,能不用尽量不用!
[Quote=引用 24 楼 mandysss 的回复:]
引用 18 楼 lyconglove 的回复:
应该用函数的递归来做吧!

#include "stdafx.h"
#include"iostream"
using namespace std;
int A=0 , B=0;
int f(int n)
{
if(n==1||n==2)return 1;
else return((A * f(n - 1) + B * f(n - 2)) % 7 );
}
int main()
{
int n;
cout < <"input A B and n" < <endl;
cin>>A>>B>>n;
cout < <"f(" < <n < <")=" < <f(n) < <endl;
return 0;
}


递归应该不…
[/Quote]
sweetjian 2009-03-26
  • 打赏
  • 举报
回复
看不懂飞雪的算法,倒是提醒我要好好学习数学了。数学好差,上学期差点挂了
fairchild811 2009-03-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ltc_mouse 的回复:]
参数判断是不等价的,如输入 -1 -3 4
if(A + B + n == 0)
break;
if(a==0 && b==0 && n==0)
break;
[/Quote]

up,这两个不一样吧
sunyuke 2009-03-26
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 baihacker 的回复:]
引用 35 楼 sunyuke 的回复:
引用 19 楼 baihacker 的回复:
C/C++ code
//this code can ac the problem
#include <iostream>
#include <deque>
#include <vector>
using namespace std;

int solve(int a, int b, int n)
{
int a11 = a, a12 = b;
int a21 = 1, a22 = 0;
int b1 = 1, b2 = 1;
while (n)
{
if (n&1)
{
int tb1 = a11*b1+a12*…
[/Quote]
原来矩阵可以这么用,学习了!
谢谢飞雪~~
太乙 2009-03-26
  • 打赏
  • 举报
回复
upup~~
Paradin 2009-03-26
  • 打赏
  • 举报
回复
no
baihacker 2009-03-26
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 sunyuke 的回复:]
引用 19 楼 baihacker 的回复:
C/C++ code
//this code can ac the problem
#include <iostream>
#include <deque>
#include <vector>
using namespace std;

int solve(int a, int b, int n)
{
int a11 = a, a12 = b;
int a21 = 1, a22 = 0;
int b1 = 1, b2 = 1;
while (n)
{
if (n&1)
{
int tb1 = a11*b1+a12*b2;
int tb2 = a…
[/Quote]

这才是这类题目的常规解法.

用矩阵计算,来计算递推.
比如

f(n+1) = a*f(n)+b*f(n-1);
f(0) = f(1) = 1;
记b =
1
1
那么矩阵
a b
1 0
左乘以b就是
a+b
1
一般说来
不妨设,某个向量为
f(n)
f(n-1)
那么
这个矩阵左乘以它就是
a*f(n)+ b*f(n-1)
f(n)
元素就变成了
f(n+1)
f(n)
于是f(n)就是这个矩阵乘以
1
1
n次
的结果取第二个分量.

而矩阵的n次方,正好可以利用算法

int result = 1;
for (;n; m*=m, n /= 2)
if(n&1) result*=m;
return result;
来解决.从而达到快速计算的目的.
逸萌 2009-03-26
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 baihacker 的回复:]
C/C++ code
//this code can ac the problem
#include <iostream>
#include <deque>
#include <vector>
using namespace std;

int solve(int a, int b, int n)
{
int a11 = a, a12 = b;
int a21 = 1, a22 = 0;
int b1 = 1, b2 = 1;
while (n)
{
if (n&1)
{
int tb1 = a11*b1+a12*b2;
int tb2 = a21*b1+a22*b2;
b1 = tb1%7, b2 = tb…
[/Quote]
UP
aaaa3105563 2009-03-26
  • 打赏
  • 举报
回复
顶上···············
sunyuke 2009-03-26
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 baihacker 的回复:]
C/C++ code
//this code can ac the problem
#include <iostream>
#include <deque>
#include <vector>
using namespace std;

int solve(int a, int b, int n)
{
int a11 = a, a12 = b;
int a21 = 1, a22 = 0;
int b1 = 1, b2 = 1;
while (n)
{
if (n&1)
{
int tb1 = a11*b1+a12*b2;
int tb2 = a21*b1+a22*b2;
b1 = tb1%7, b2 = tb…
[/Quote]
不好意思 今天才重新看了这个帖子
飞雪 你的代码我还没看懂
sunyuke 2009-03-26
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 sunyuke 的回复:]
不好意思 这么晚才回
LS说的我已经测试过了 跟数组初始化没有关系
你说的情况运行时也没发现 输入1 7 X 输出0的情况
数组没有初始化,a[3]之后也可能自动赋值为a[3]
而且a[3]之后的数也不会用到
[/Quote]
sunyuke 2009-03-26
  • 打赏
  • 举报
回复
不好意思 这么晚才回
LS说的我已经测试过了 跟数组初始化没有关系
你说的情况运行时也没发现 输入1 7 X 输出0的情况
数组没有初始化,a[3]之后也可能自动赋值为a[3]
而且a[3]之后的数也不会用到
品茶 2009-03-25
  • 打赏
  • 举报
回复
HDU是杭州电子大学的简称
LZ的题目是HDU的Online Judge System(类似于ACM)上的题
WA(Wrong Answer)是术语,即使代码编译执行都没问题,但是一些边界检测没通过(比如数据溢出或执行时间超过规定时间等)也会得到WA评价

LZ的问题应该是将数组a[300]初始化为0
当A=1,B=7的时候,不管N为多少,正确答案应该全是1
而LZ的代码执行后,a[1],a[2],a[3]为1,其余都是0;所以WA

第二段代码没有将数组初始化,所以a[3]得到1跳出循环后,a[3]以后的数据自动赋值为a[3]的值,即1,所以能通过。
mandysss 2009-03-25
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 TeaTimeL 的回复:]
LZ的代码循环到300,你下面那个只到200
递归很耗内存,因为f(n)不算到f(1),前面n-1个函数是不会释放的。
而函数f(m)下面会有m-1个函数,所以不要简单的认为能存放n个函数就够了。
n*(n+1)/2才够。
建议LZ循环条件改小点。
[/Quote]

LZ的程序没有用递归啊,他的办法就是避免了递归
ok88062736 2009-03-25
  • 打赏
  • 举报
回复
其实只要算法懂就可以了 ACM的格式要求很高 我觉得实际用处不大 LZ不要担心哈...
yzzrn 2009-03-24
  • 打赏
  • 举报
回复
代码没有看,算法应当是动态规划的内容,要不然很难算的。
看你的函数长得就像斐波列切数列。记得这家伙的复杂度是和2^n差不多的,大概是1.6^n的样子

replied by ebenzhang.blogbus.com
品茶 2009-03-24
  • 打赏
  • 举报
回复
LZ的程序,递归函数调用了两个低阶函数,所以是1+3+5+...+n==n*n个函数
品茶 2009-03-24
  • 打赏
  • 举报
回复
LZ的代码循环到300,你下面那个只到200
递归很耗内存,因为f(n)不算到f(1),前面n-1个函数是不会释放的。
而函数f(m)下面会有m-1个函数,所以不要简单的认为能存放n个函数就够了。
n*(n+1)/2才够。
建议LZ循环条件改小点。
grellen 2009-03-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ltc_mouse 的回复:]
参数判断是不等价的,如输入 -1 -3 4
if(A + B + n == 0)
break;
if(a==0 && b==0 && n==0)
break;
[/Quote]
up
加载更多回复(25)

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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