zoukankan      html  css  js  c++  java
  • [杭电oj][1005]Number Sequence

    sky同学在努力地刷题..,在这题卡住了,于是一起研究了一下...

    这题本身挺简单的,(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. 递推公式本身是mod7的...所以f(n-1)和f(n-2)最多只有49种状态,根据鸽巢原理在50以内必定循环。

    只要推导出周期和循环的起始位置就行了。一开始只算了周期,没考虑从哪里开始循环,但竟然神奇地AC了。。。后来想了想觉得不对,应该加入循环的起始位置。

    经过手动验证 7 7 49这组数据,正确输出应该为0,觉得我没有想错。

    看了一下Discuss的部分,感觉这题数据各种神奇。评论里面好多直接mod48的都神奇地过了..评论里基本上都没有考虑循环初始位置的样子, 对于7 7 49这组数据基本给出的

    输出都是错误的。

    程序代码如下:

    这题本来交了一发,但是看了评论之后觉得自己写的有bug,于是改了一发,现在大概是比较正确的TAT。。。
    手动测试了如下几组数据,均正确:
    2 2 48
    7 7 49
    247 602 35363857
    376 392 9671521
    759 623 18545473
    53 399 46626337
    316 880 10470347
    应该输出为 3 0 4 3 5 2 3(可以写一个暴力程序来验证..)
    #include <cstdio>
    #include <string.h>
    #include <cmath>
    #include <iostream>
    using namespace std;
    #define REP(i,n) for(int i=0;i<n;i++)
    #define FOR(i,a,b) for(int i=a;i<=b;i++)
    #define DOWN(i,b,a) for(int i=b;i>=a;i--)
    int A,B,C;
    int T;
    int strt;
    int a[100]={0,1,1};
    void out(){
    FOR(i,1,50)printf("%d ",a[i]);
    printf(" ");
    }
    int main(){
    while(scanf("%d%d%d",&A,&B,&C)!=EOF&&C){
    A%=7;
    B%=7;
    FOR(i,3,100){
    a[i]=(A*a[i-1]+B*a[i-2])%7;
    FOR(j,3,i-1){
    if(a[j]==a[i]&&a[j-1]==a[i-1]){
    strt=j;
    T=i-j;
    i=100;
    break;
    }
    }
    }
    if(C<=strt)printf("%d ",a[C]);
    else printf("%d ",a[(C-strt)%T+strt]);
    FOR(i,3,100){
    a[i]=(A*a[i-1]+B*a[i-2])%7;
    }
    //out();
    }
    return 0;
    }

  • 相关阅读:
    vb.net EXCEL进程问题
    VB.NET 中使用正则表达式
    改变鼠标状态
    举证信息表,语言不是VB.NET 是VBA的
    初学查询时的一些东西
    删除关联错误
    对于 using ESRI.ArcGIS.Carto; 的引用。是否缺少 using 指令或程序集引用
    AxMapControl 引用问题
    堆排序:大顶堆,小顶堆
    abs()函数,fabs函数(),max()函数的区别
  • 原文地址:https://www.cnblogs.com/mothyrose/p/8073374.html
Copyright © 2011-2022 走看看