1005 Number Sequence

时间限制: 1 Sec  内存限制: 60 MB

题目描述

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). 

输入

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.

输出

For each test case, print the value of f(n) on a single line.

样例输入

1 1 3
1 2 10
0 0 0

样例输出

2
5

解题思路

显然,这是一个找周期的问题。

我们很容易推出,一定有周期,而且最小周期不超过49,(在下面,都假设a和b小于7,即已经%7),而且,如果a、b不全为0,那么一定是从第1项开始循环的,当a=b=0时,不是从第1项开始,而是从第3项开始循环。我一开始的方法是,对于每组给的a、b,求出最小正周期

代码:

#include <stdio.h>
/*找周期*/
int period(int a, int b)
{
    int t = 0, f1 = 1, f2 = 1, temp;
    if (a == 0 || b == 0)
        return 12;
    if ((a + b) % 7 == 1)
        return 1;
    while (1)
    {
        temp = (a * f1 + b * f2) % 7;
        f2 = f1;
        f1 = temp;
        t++;
        if (f1 == 1 && f2 == 1)     /*再次遇到f1 = 1,f2 = 1的时候跳出*/
            break;
    }
    return t;
}
int main()
{
    int a, b, n, f1, f2, temp;
    while (scanf("%d%d%d", &a, &b, &n), a, b, n)
    {
        if (a % 7 == 0 && b % 7 == 0)
        {
            printf("%d\n", n < 3);
            continue;
        }
        f1 = 1, f2 = 1;
        if (n > 20)
            n = (n - 20) % period(a % 7, b % 7) + 20;
        if (n > 2)
            n -= 2;
        else n = 0;
        while (n--)
        {
            temp = (a * f1 + b * f2) % 7;
            f2 = f1;
            f1 = temp;
        }
        printf("%d\n", f1);
    }
    return 0;
}

我发现网上有有很多这道题的题解,代码很短,就看了一下,发现他们是直接以48为周期,甚至还有很多人说49是周期。。。

但是我枚举了a和b(一共也就49种情况),发现周期并不是48。

代码:

int main()
{
    for (int i = 0; i < 7; i++)
    {
        for (int j = 0; j < 7; j++)
            printf("%d ", period(i, j));
        printf("\n");
    }
    return 0;
}

结果:

12 12 12 12 12 12 12
12 16 6 24 48 21 6
12 6 48 6 48 24 1
12 16 48 42 6 1 8
12 16 48 21 1 6 8
12 6 48 1 48 24 14
12 16 1 24 48 42 3

很明显,有14、21、42的存在,显然48不是周期!所以说,应该是OJ给的测试数据很水,有很多代码都浑水摸鱼了。但336一定是周期,所以就可以写出代码了。

代码:

#include <stdio.h>
int main()
{
    int a, b, n, f1, f2, temp;
    while (scanf("%d%d%d", &a, &b, &n), a, b, n)
    {
	if (a % 7 == 0 && b % 7 == 0)
	{
	    printf("%d\n", n < 3);
	    continue;
	}
	f1 = 1, f2 = 1;
	n = (n + 333) % 336 + 1;
	while (n--)
	{
            temp = (a * f1 + b * f2) % 7;
	    f2 = f1;
	    f1 = temp;
	}
	printf("%d\n", f1);
    }
    return 0;
}

Number Sequence(周期是336!!不是48!!)的更多相关文章

  1. A - Number Sequence(矩阵快速幂或者找周期)

    Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * ...

  2. HDU1005 Number Sequence(找规律,周期是变化的)

    传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1005 Number Sequence Time Limit: 2000/1000 MS (Java/O ...

  3. hdu1005 Number Sequence(数论)

    Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tot ...

  4. HDU 1005 Number Sequence【多解,暴力打表,鸽巢原理】

    Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  5. HDU 1005 Number Sequence

    Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  6. Number Sequence

    Number Sequence   A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) ...

  7. hdu 1005:Number Sequence(水题)

    Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...

  8. Number Sequence (HDoj1005)

    Problem Description A number sequence is defined as follows: f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1 ...

  9. 1005 Number Sequence(HDU)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1005 Number Sequence Time Limit: 2000/1000 MS (Java/O ...

随机推荐

  1. sql 日常使用记录

    sql 某个字段在哪些表中存在: select sysobjects.name from syscolumns inner join sysobjects on syscolumns.id = sys ...

  2. Building Forms with PowerShell – Part 1 (The Form)

    For those of you familiar with Scripting languages you are probably used to using alternate applicat ...

  3. Django的View(视图)和路由系统

    一.Django的View(视图) 1.介绍 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一 ...

  4. CF908D New Year and Arbitrary Arrangement(期望Dp+数学)

    题目大意:给你一个空字符串,你有\(\frac{pa}{pa+pb}\)的概率往字符串最后面加个\(a\),\(\frac{pb}{pa+pb}\)的概率往字符串最后面加个\(b\),当子序列\(ab ...

  5. 使用WebClient进行文件上传

    注释部分为异步上传,几行代码就能搞定 public static bool Upload(string url, string path) { using (WebClient client = ne ...

  6. openJDK之如何下载各个版本的openJDK源码

    如果我们需要阅读openJDK的源码,那么需要下载,那么该去哪下载呢? 现在JDK已经发展到版本10了,11已经处于计划中,如果需要特定版本的openJDK,它们的下载链接在哪呢? 1.openJDK ...

  7. npm install 之前做的事

    在一个项目目录中,npm install之前,需要npm init,npm init会问你几个问题,有的需要输入,不想输入的一路回车就行,之后会自动创建一个package.json文件,有了这个pac ...

  8. Hadoop记录-JMX参数

    Yarn metrics参数说明 获取Yarn jmx信息:curl -i http://xxx:8088/jmx Hadoop:service=ResourceManager,name=FSOpDu ...

  9. .net Core 下数据库访问

    SqlSugar :是一款高性能(达到ADO.NET最高性能水平)SqlSugar :是除EF外拉姆达解析最完善的ORM,多表 .UnionALL. 交叉子查询.真实的批量操作和分页SqlSugar ...

  10. SpringBoot(七):SpringBoot整合Swagger2

    原文地址:https://blog.csdn.net/saytime/article/details/74937664 手写Api文档的几个痛点: 文档需要更新的时候,需要再次发送一份给前端,也就是文 ...