HDU1005 找规律 or 循环点 or 矩阵快速幂

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

1.一开始就注意到了n的数据范围 <=100 000 000,但是还是用普通的循环做的,自然TLE了,然后朴素打表,= =运行不了,(怎么可能能把数组开到那么大)。再然后就想到了寻找下一个1 1 连续在一起的,那就能开始下一轮循环了。

但是,各种WA……(将数组开大一点,寻找到a[ i ] = a[ i -1 ] ==1 即跳出),这个AC代码将102改成100,150,200都可以,但是108,49 ,204什么的就不行。

其实也可能数组并不是从11开始循环的,而是后面出现了两组相邻相同的非1 1数,循环则从最先出现两组相邻对等的数开始循环。如1 1 …………X X…………X X…………然后循环就从XX开始循环,不关1 1什么事儿了,但是下面这个代码却能AC而且数组的长度(maxn)有一定限制,有些能有些不能(???)。

#include <cstdio>
#include <iostream>
#define maxn 102

using namespace std;

int num[maxn];
int main()
{
    int a,b,n,i=3;
    num[0]=1;    num[1]=1;    num[2]=1;
    while(~scanf("%d%d%d",&a,&b,&n),a||b||n)
    {
        i=3;
        for(i=3;i<maxn;i++)
        {
            num[i]=(a*num[i-1]+b*num[i-2])%7;
            if(num[i]==1&&num[i-1]==1)
                break;
        }
        num[0]=num[i-2];
        n%=i-2;
        cout << num[n] << endl;
    }
    return 0;
}

然后就看有说fn =fn-1 + fn-2 再对7取模,其中的f 项都是0 - 6 之间的数,所以 两数相加之和再取模,最多有7*7种可能后必定会fn-1 与 fn-2 的值的情况与前面的有重复,所以循环节为49 ,这感觉是最容易接受也最为合理的一种解释。

然后就有了如下AC代码,其中maxn为48,49均可(???)。

#include <cstdio>
#include <iostream>
#define maxn 48

using namespace std;

int num[maxn];
int main()
{
    int a,b,n,i=3;
    num[0]=1;    num[1]=1;    num[2]=1;
    while(~scanf("%d%d%d",&a,&b,&n),a||b||n)
    {
        i=3;
        for(i=3;i<=maxn;i++)
        {
            num[i]=(a*num[i-1]+b*num[i-2])%7;
            /*if(num[i]==1&&num[i-1]==1)
            {
                //cout << i << endl;
                break;
            }*/
        }
        num[0]=num[maxn];
        cout << num[n%maxn] << endl;
    }
    return 0;
}

再然后就是矩阵快速幂了,占坑,(回来学= =)。

最后贴个暴力代码(网上搜的,这个厉害了= =),一个个试,找到他们不同的A,B下他们的周期的最小公倍数为1008。

#include<iostream>   

using namespace std;   

int main()   

{   

    int a,b,n,i;   

    while(scanf("%d%d%d",&a,&b,&n)&&a&&b&&n)   

    {   

        int f[1009];   

        f[1]=1;   

        f[2]=1;   

        for(i=3;i<=1008;i++)   

        {   

            f[i]=(a*f[i-1]+b*f[i-2])%7;   

        }   

        printf("%d\n",f[(n-1)%1008+1]);   

    }   

    return 0;   

}  

以上为做了耗了我几个小时的hdu1005(不知道值不值= =)。

未解之谜……待续。

时间: 2024-08-04 20:25:59

HDU1005 找规律 or 循环点 or 矩阵快速幂的相关文章

数论基础——循环节和矩阵快速幂的运用

首先我们来看一道基础题: 题目链接:HDU1005 Number Sequence 题目描述: Number Sequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 147421    Accepted Submission(s): 35814 Problem Description A number sequence is

HDU 2276 &amp; FZU 1692 (循环同构优化+矩阵快速幂)

HDU 2276 题意: 给定一个01**字符串环**(2<=字符串长度<=100)然后进行m次的变换. 定义变换的规则为:如果当前位置i的左边是1(下标为0的左边是n-1),那么i就要改变状态0->1 , 1->0 比如当前的状态为100101那么一秒过后的状态为010111. 思路: 用公式表示变化状态其实就是: ai=(a(i+n?1)%n+ai)%2 换成位操作就是: ai=a(i+n?1)%n^ ai 于是我们可以建立一个变化矩阵: ??????????1100...00

hud5451_求循环节加矩阵快速幂

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5451 题目描述: 对于,给出x和mod,求y向下取整后取余mod的值为多少? 找循环节解析链接:http://blog.csdn.net/ACdreamers/article/details/25616461 裸题链接:http://blog.csdn.net/chenzhenyu123456/article/details/48529039 1 #include <algorithm> 2 #i

poj 3734 矩阵快速幂+YY

题目原意:N个方块排成一列,每个方块可涂成红.蓝.绿.黄.问红方块和绿方块都是偶数的方案的个数. sol:找规律列递推式+矩阵快速幂 设已经染完了i个方块将要染第i+1个方块. a[i]=1-i方块中,红.绿方块数量都是偶数的方案数 b[i]=1-i方块中,红.绿方块数量一个是偶数一个是奇数的方案数(红even绿odd 或 红odd绿even) c[i]=1-i方块中,红.绿方块数量都是奇数的方案数 可以得出递推公式: a[i+1]=2*a[i]+b[i] b[i+1]=2*a[i]+2*b[i

UVA10518 - How Many Calls?(矩阵快速幂)

题目链接 题目大意:给你fibonacci数列怎么求的,然后问你求f(n) = f(n - 1) + f(n - 2)需要多少次调用,并且这个数很大,取模一个进制的数. 解题思路:要发现F(n) = 2 *f(n) - 1这个规律,估计要很熟系fibonacci数列,我明明推出了好多项后但是一点也没有发现规律.然后要用矩阵快速幂来求fibonacci,因为n很大.构造这样的矩阵 1, 1 (2*2矩阵) *  f(n - 1) (2*1矩阵) 等于 f(n - 1) + f(n - 2)(2*1

hdu 2604 Queuing dp找规律 然后矩阵快速幂。坑!!

http://acm.hdu.edu.cn/showproblem.php?pid=2604 这题居然O(9 * L)的dp过不了,TLE,  更重要的是找出规律后,O(n)递推也过不了,TLE,一定要矩阵快速幂.然后立马GG. 用2代表m,1代表f.设dp[i][j][k]表示,在第i位,上一位站了的人是j,这一位站的人是k,的合法情况. 递推过去就是,如果j是1,k是2,那么这一位就只能放一个2,这个时猴dp[i][k][2] += dp[i - 1][j][k]; 其他情况分类下就好,然后

HDU 4990 Reading comprehension(找规律+矩阵快速幂)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4990 Problem Description Read the program below carefully then answer the question. #pragma comment(linker, "/STACK:1024000000,1024000000") #include <cstdio> #include<iostream> #include

(hdu 6030) Happy Necklace 找规律+矩阵快速幂

题目链接 :http://acm.hdu.edu.cn/showproblem.php?pid=6030 Problem Description Little Q wants to buy a necklace for his girlfriend. Necklaces are single strings composed of multiple red and blue beads. Little Q desperately wants to impress his girlfriend,

51nod-1537 1537 分解(矩阵快速幂+找规律)

题目链接: 1537 分解 问(1+sqrt(2)) ^n  能否分解成 sqrt(m) +sqrt(m-1)的形式 如果可以 输出 m%1e9+7 否则 输出no Input 一行,一个数n.(n<=10^18) Output 一行,如果不存在m输出no,否则输出m%1e9+7 Input示例 2 Output示例 9 题意: 思路: 发现跟奇数偶数有关系,然后就找出递推式,然后就快速幂,然后就A了; AC代码: #include <iostream> #include <cst