zoukankan      html  css  js  c++  java
  • hd acm1005

    问题:

    已知递推公式:f[i] = ( a * f[i-1] + b * f[i-2] ) % 7,f[1]=1,f[2]=1。

    需要你输入三个数a,b,n。其中a,b用来补充上述公式,用补充后的公式计算 f[n]。

    析:

    每次输入a,b都会有一个对应的公式,由这个公式会得到的一个周期性的数列,然后利用这个周期来计算f[n]便可以了。所以如何找到周期是重点,因为每个周期开始时前两个数字会是1,1,这可以是一个标志,当然别的标志也可以;另外需要注意一点,如果a,b都能整除7,那么从f[3]向后都会成为0,可以直接结束。

    代码:

    #include <stdio.h>
    #include <stdlib.h>

    int main()
    {
      int a,b,i,n,flag;
      int f[201]={1,1,1};
      while(scanf("%d%d%d",&a,&b,&n))

      {
        if(!(a||b||n)) break; //a,b,n全是0时结束循环
        flag=0;
        for(i=3;i<=200;i++)

        {
          f[i]=(a*f[i-1]+b*f[i-2])%7;
          if(f[i]==1&&f[i-1]==1     //找到周期时结束
            if(i>3) break;      //防止出现1,1,1,1,1,1,1......1,1......的情况
          if(a%7==0&&b%7==0)      //如果a,b都能整除7,则f[3]之后的全为0,直接输出并结束
          {   

             flag=1;
             break;
          }
        }
         if(flag){
          printf("0 ");
          continue;
        }
           i-=2;               //i-2是周期。
        n%=i;
       if(!n) n=i;
         printf("%d ",f[n]);
      }
    return 0;
    }

  • 相关阅读:
    C++容器不要类型转换
    栈区、堆区、全局区、文字常量区、程序代码区
    C++数据类型字节数
    Exception-Safe Generic Containers
    饭碗是要靠抢的
    Wireshark抓包实例分析TCP重复ACK与乱序
    OSPF
    孩子,我该让你更好的长大!
    云,除了卖,我们还剩下什么?
    动态路由3--链路状态路由选择协议
  • 原文地址:https://www.cnblogs.com/clljs/p/7450013.html
Copyright © 2011-2022 走看看