F(N)---hdu2802(寻找循环节)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2802

f[1] = 1;

f[2] = 7;

f[n] = (f[n-2] - (n-1)*(n-1)*(n-1)+ n*n*n) % 2009, n>2;

给你一个n让你输出f[n];(n<1e9)由于n较大,所以不能直接输出,结果是对2009求余所以一定存在循环节,由于f(n)只与f(n-2)有关所以我们只需判断再次出现1或7即可;

#include <stdio.h>
#include <algorithm>
#include<string.h>
#include<queue>
using namespace std;

#define met(a, b) memset(a, b, sizeof(a))
#define MOD 1000000007
#define N 5050
#define INF 0x3f3f3f3f

typedef long long LL;

int f[N] = {0, 1, 7}, n, m;

int main()
{
    for(int i=3; ; i++)
    {
        f[i] = (f[i-2] - (i-1)*(i-1)*(i-1)+ i*i*i) % 2009;

        if(i%2==1&& f[i]==1)///说明循环节已经存在;
        {
            m = i;///循环节为 m-1;
            break;
        }
    }

    while(scanf("%d", &n), n)
    {
        printf("%d\n", f[n%(m-1)]);
    }
    return 0;
}

时间: 2024-10-03 00:46:19

F(N)---hdu2802(寻找循环节)的相关文章

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

首先我们来看一道基础题: 题目链接: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

循环节长度

两个整数做除法,有时会产生循环小数,其循环部分称为:循环节. 比如,11/13=6=>0.846153846153.....  其循环节为[846153] 共有6位. 下面的方法,可以求出循环节的长度. 请仔细阅读代码,并填写划线部分缺少的代码. public static int f(int n, int m) { n = n % m;   Vector v = new Vector(); for(;;) { v.add(n); n *= 10; n = n % m; if(n==0) ret

HDU 5895 Mathematician QSC(矩阵乘法+循环节降幂+除法取模小技巧+快速幂)

传送门:HDU 5895 Mathematician QSC 这是一篇很好的题解,我想讲的他基本都讲了http://blog.csdn.net/queuelovestack/article/details/52577212 [分析]一开始想简单了,对于a^x mod p这种形式的直接用欧拉定理的数论定理降幂了 结果可想而知,肯定错,因为题目并没有保证gcd(x,s+1)=1,而欧拉定理的数论定理是明确规定的 所以得另谋出路 那么网上提供了一种指数循环节降幂的方法 具体证明可以自行从网上找一找 有

第六届蓝桥杯java试题-循环节长度

两个整数做除法,有时会产生循环小数,其循环部分称为:循环节. 比如,11/13=6=>0.846153846153.....  其循环节为[846153] 共有6位. 代码如下 <span style="font-size:18px;">import java.util.Vector; /** * * @author Administrator * 类名:Main * 创建时间:2015-5-1 * vesion1.0 */ public class Main { p

Uva 12012 Detection of Extraterrestrial 求循环节个数为1-n的最长子串长度 KMP

题目链接:点击打开链接 题意: 给定一个字符串str 求字符串str的 循环节个数为 1-len 个的 最长子串长度 思路:套用kmp的性质 #include<string.h> #include<stdio.h> #include <iostream> using namespace std; #define n 1300 void getnext(char str[n],int next[n]){ int m=strlen(str); next[0]=next[1]

HDU 1005矩阵快速幂解法 循环节解法

循环节解法: 对于公式 f[n] = A * f[n-1] + B * f[n-2]; 后者只有7 * 7 = 49 种可能,为什么这么说,因为对于f[n-1] 或者 f[n-2] 的取值只有 0,1,2,3,4,5,6 这7个数,A,B又是固定的,所以就只有49种可能值了.由该关系式得知每一项只与前两项发生关系,所以当连续的两项在前面出现过,由于公式不变,那么后面得到的一定是跟前面相重复的.所以这个时候循环节就出现了,注意循环节并不一定会是开始的 1,1:但1,1一定可以作为一个循环节,只不过

Brute-force Algorithm HDU - 3221(指数循环节 矩阵快速幂)

水题一道 推一下就是 f[n] = f[n - 1] + f[n - 2] 发现n很大 所以用矩阵快速幂就好了 还有P很大  那就指数循环节 一定要注意   这个条件 #include <iostream> #include <cstdio> #include <sstream> #include <cstring> #include <map> #include <cctype> #include <set> #incl

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 1961 Period【求前缀的长度,以及其中最小循环节的循环次数】

Period Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 14653   Accepted: 6965 Description For each prefix of a given string S with N characters (each character has an ASCII code between 97 and 126, inclusive), we want to know whether the