Number Sequence

http://acm.hdu.edu.cn/showproblem.php?pid=1005

Number Sequence

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


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


f数列的加强版,涉及到找循环节以及数的模运算

(a + b) % p = (a % p + b % p) % p
(a - b) % p = (a % p - b % p) % p
(a * b) % p = (a % p * b % p) % p
(a^b) % p = ((a % p)^b) % p
使用后面的式子可以减少溢出

#include<stdio.h>
int main(){
  //  freopen("in.txt","r",stdin);
    int a,b,n;
    while(scanf("%d%d%d",&a,&b,&n)!=EOF){
        if(a==0&&b==0&&n==0){
            break;
        }
        int start=0;
        int size=0;
        bool find=false;    
        int f[100];
        for(int i=1;i<100;i++){
            if(i==1||i==2){
                f[i]=1;
            }
            else{
                f[i]=(a*f[i-1]%7+b*f[i-2]%7)%7;
                //找寻环节不能认为是11开始的,因为有1100000000...的情况 
                //找循环节,例如计算f[i]时,遍历f找和f[i],f[i-1]相等的
                //如果有,则找到,如果没有,则继续寻找 
                for(int j=2;j<i;j++){
                    if(f[j]==f[i]&&f[j-1]==f[i-1]){
                        start=j-1;
                        size=i-2;
                        find=true;
                        break;
                    }
                }
                if(find){
                    break;
                }
            }
        }

        if(start==1){
            int ans=n%size;
            if(ans==0){
                ans=size;
            }
            printf("%d\n",f[ans]);
            
        }else{
            if(n<start){
                printf("%d\n",f[n]);
            }else{
                size=size-start+1;
                int ans=(n-start+1)%size;
                if(ans==0){
                    printf("%d\n",f[start+size-1]);
                }
                else{
                    printf("%d\n",f[start+ans-1]);
                }
                
            }
            
            
        }
          
    }
    
 
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值