首页 > 其他分享 >数列(循环节)

数列(循环节)

时间:2022-08-16 10:15:23浏览次数:78  
标签:10 数列 int times 循环 include id

题意

有一个整数数列\(a_0, a_1, a_2, a_3 \dots\)

该数列的前两项\(a_0, a_1\)的具体值已知,其它项可以通过如下递推式求出:

  • \(a_n = p \times a_{n−1} + q \times a_{n−2}(n \geq 2)\)

给定一个可能非常大的正整数\(N\)和两个不太大的正整数\(M, K\),请你分别计算并输出\(a_{N+1}, a_{N+2}, \dots, a_{N+K}\)对\(M\)取模的值。

题目链接:https://www.acwing.com/problem/content/4584/

数据范围

\(0 < a_0, a_1, p, q \leq 32693\)
\(0 < M \leq 3 \times 10^3\)
\(0 < K \leq 10^4\)
\(0 < N < 10^{10^6}\)

思路

首先我们观察到\(M\)的范围较小,只有\(3 \times 10^3\),因此数列中的数最多有\(3 \times 10^3\)个取值。

\(N\)特别大,这种题目的典型套路是分析循环节。

那么什么时候才会出现循环呢?如果\(a_{i-1}\)和\(a_i\)在之前出现过,即存在\(j < i\)满足\(a_{j-1} = a_{i-1}\)并且\(a_j = a_i\)。那么就出现循环了。其中循环节的长度为\(r = i-j\)。

因此,我们只需要计算出\(N\)位于循环节的哪个位置即可,即:\((n - (j - 1)) \% r = n \% r - (j - 1) \% r\)。

代码

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>

using namespace std;

const int N = 1e7 + 10, M = 3010;

int a[N], p, q;
int m, k;
int id[M][M];
string n;

int main()
{
    cin >> a[0] >> a[1] >> p >> q >> m >> k >> n;
    a[0] %= m, a[1] %= m;
    id[a[0]][a[1]] = 1;
    int ed, st;
    for(int i = 2; i < N; i ++) {
        a[i] = (a[i - 1] * p % m + a[i - 2] * q % m) % m;
    }
    for(int i = 2; i < N; i ++) {
        if(id[a[i - 1]][a[i]]) {
            ed = i - 2;
            st = id[a[i - 1]][a[i]] - 1;
            break;
        }
        id[a[i - 1]][a[i]] = i;
    }
    int len = ed - st + 1;
    if(n.size() <= 7) {
        int num = 0;
        for(int i = 0; i < n.size(); i ++) {
            num = num * 10 + n[i] - '0';
        }
        for(int i = 1; i <= k; i ++) {
            cout << a[num + i] << '\n';
        }
    }
    else {
        int num = 0;
        for(int i = 0; i < n.size(); i ++) {
            num = (num * 10 % len + n[i] - '0') % len;
        }
        int r = (num - st % len + len) % len;
        for(int i = st + r + 1; i <= st + r + k; i ++) {
            cout << a[i] << '\n';
        }
    }
    return 0;
}

标签:10,数列,int,times,循环,include,id
From: https://www.cnblogs.com/miraclepbc/p/16590651.html

相关文章

  • vue js 计时器setInterval(),setTimeout() 循环调用,定时调用
    setInterval():他就是每隔多少秒或毫秒调用(循环的调用)。setTimeout():他就是过了多少秒或毫秒调用(调用一次)。//过500毫秒调用setTimeout(()=>{//方法区},500);//......
  • 641. 设计循环双端队列
    原题链接https://leetcode.cn/problems/design-circular-deque/题目设计实现双端队列。实现MyCircularDeque类:MyCircularDeque(intk):构造函数,双端队列最大为k......
  • fastjson中$ref循环引用
    问题描述:  当我们使用fastjson工具包的方法转换成字符串时,我们发现转换后的字符串不正确,出现了$ref,如图为啥会出现$ref:  这是因为我们对象出现了重复引用,待转换......
  • C#运算符与判断循环
    一、运算符原文:https://www.runoob.com/csharp/csharp-operators.html运算符是一种告诉编译器执行特定的数学或逻辑操作的符号。C#有丰富的内置运算符,分类如下:算术运......
  • python教程:一个 list 使用 for 遍历,边循环边删除的问题
    今天由于要对一个list数据类型写一个循环删除的程序(这是小编第一次对于list操作),但发现一个奇异问题,来,我们来看看代码跟效果:#初始化一个list列表,为了下边的方便比较......
  • Python-08while循环
    while循环Python提供了While和for循环,(在Python中没有do..while循环)如果使用 while 循环,给定的判断条件为true时执循环体,否则退出循环体。1#在Python中没有do...whi......
  • C++ 用for/while循环实现字符串逆置输出
    1.for循环实现字符串逆置#include<iostream>usingnamespacestd;intmain(){stringstr;cout<<"请输入一个字符串:"<<endl;cin>>str;......
  • 服务器无法登录之迷——login界面无限循环
         本周遇到了一个很奇葩的问题,客户的一台服务器无论如何都无法登录到机器系统里面去。可以肯定的是输入的登录密码是完全正确的,但是输入密码后,总在login登录界面无......
  • 循环语句
    循环的概念重复的执行一段的代码,避免死循环,提高效率(时间复杂度(关注)空间复杂度(不关注))三大循环语句:while语句dowhile语句for语句循环三要素初始值(初始的变量值)......
  • 练习7:使用for循环,用“*”输出一个直角三角形 、一个等腰三角形和一个梯形
    #题干:使用for循环,在屏幕上用'*'输出一个直角三角形、一个等腰三角形和一个梯形。图形的行数由用户input()输入确定,其他属性自己设置。'''**********'''#打印......