Number Sequence(找规律,,,,,反正我没找到,递归超内存了....)

Number Sequence

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 178534    Accepted Submission(s): 44354


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
一看这题立马写了个递归然后出了个这个 Memory Limit Exceeded,,,内存超了,,

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <string.h>

using namespace std;

int f(int A, int B, int n){
    if(n==1) return 1;
    if(n==2) return 1;
    return (A*f(A, B, n-1)+B*f(A, B, n-2))%7;
}
int main(){

    int n, A, B;
    while(scanf("%d%d%d",&A,&B,&n), A&&B&&n){
        printf("%d\n",f(A,B,n));
    }

    return 0;
}

然后发现应该是个循环,再写被T了;

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <string.h>

using namespace std;

int main(){

    int n, A, B;
    while(scanf("%d%d%d",&A,&B,&n)){
        if(A==0 && B==0 && n==0) break;
        int ff[1000];
        ff[1]=ff[2]=1;
        int i=3;
        for(i=3; i<=n; i++){
            ff[i]=(A*ff[i-1]+B*ff[i-2])%7;
           // printf("%d ",ff[i]);
            if(ff[i]==1&&ff[i-1]==1) break;
        }
        //printf("\n");
        if(i>n) printf("%d\n", ff[n]);
        else{
        int cnt=i-2;
        int ans;
        if(n%cnt==0) ans=cnt;
        else ans=n%cnt;
        printf("%d\n",ff[ans]);
        }
    }

    return 0;
}

然后再改,RE,,,,

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <string.h>

using namespace std;

int main(){

    int n, A, B;
    while(scanf("%d%d%d",&A,&B,&n)){
        if(A==0 && B==0 && n==0) break;
        int ff[100];
        ff[1]=ff[2]=1;
        int i=3;
        for(i=3; i<=n; i++){
            ff[i]=(A*ff[i-1]+B*ff[i-2])%7;
            //printf("%d ",ff[i]);
            if(ff[i]==1&&ff[i-1]==1) break;
        }
       // printf("\n");
        if(i>n) printf("%d\n", ff[n]);
        else{
        int cnt=i-2;
       // printf("cnt: %d\n",cnt);
        ff[0]=ff[cnt];
        printf("%d\n",ff[n%cnt]);
        }
    }

    return 0;
}
当我把for循环里的n改成50就A了,改成100还是RE,醉了;
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <stdlib.h>
#include <string.h>

using namespace std;

int main(){

    int n, A, B;
    while(scanf("%d%d%d",&A,&B,&n)){
        if(A==0 && B==0 && n==0) break;
        int ff[100];
        ff[1]=ff[2]=1;
        int i=3;
        for(i=3; i<=50; i++){        //就是这里的50,改成n就RE,,,,,,,
            ff[i]=(A*ff[i-1]+B*ff[i-2])%7;
            //printf("%d ",ff[i]);
            if(ff[i]==1&&ff[i-1]==1) break;
        }
       // printf("\n");
        if(i>n) printf("%d\n", ff[n]);
        else{
        int cnt=i-2;
       // printf("cnt: %d\n",cnt);
        ff[0]=ff[cnt];
        printf("%d\n",ff[n%cnt]);
        }
    }

    return 0;
}
最后附上大神的AC代码,就是强啊,咋想到的呢,,,,,

#include <iostream>

using namespace std;

int main()
{
    int A,B,n,i;
    int a[48];
    cin >> A >> B >> n;
    while( A!=0 || B!=0 || n!=0)
    {
        a[0]=a[1]=1;
        for(i=2;i<48;i++)
            a[i] = ( A * a[i-1] + B * a[i-2]) % 7;
        cout << a[(n-1)%48] <<endl;//48个数必定循环一遍,或以48的因子数一个循环......膜了; 
        cin >> A >> B >> n;
    }
    return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值