zoukankan      html  css  js  c++  java
  • 「P4994」「洛谷11月月赛」 终于结束的起点(枚举

    题目背景

    终于结束的起点
    终于写下句点
    终于我们告别
    终于我们又回到原点
    ……

    一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演。
    如果这次 NOIp 是你的起点,那么祝你的 OI 生涯如同夏花般绚烂。
    如果这次 NOIp 是你的终点,那么祝你的 OI 回忆宛若繁星般璀璨。
    也许这是你最后一次在洛谷上打比赛,也许不是。
    不过,无论如何,祝你在一周后的比赛里,好运。

    当然,这道题也和轮回有关系。

    题目描述

    广为人知的斐波拉契数列 mathrm{fib}(n)fib(n) 是这么计算的

    也就是 0, 1, 1, 2, 3, 5, 8, 13 cdots0,1,1,2,3,5,8,13⋯,每一项都是前两项之和。

    小 F 发现,如果把斐波拉契数列的每一项对任意大于 11 的正整数 MM 取模的时候,数列都会产生循环。

    当然,小 F 很快就明白了,因为 (mathrm{fib}(n - 1) mod Mfib(n1)modM) 和 (mathrm{fib}(n - 2) mod M)fib(n2)modM) 最多只有 M ^ 2M2 种取值,所以在 M ^ 2M2 次计算后一定出现过循环。

    甚至更一般地,我们可以证明,无论取什么模数 MM,最终模 MM 下的斐波拉契数列都会是 0, 1, cdots, 0, 1, cdots0,1,,0,1,⋯。

    现在,给你一个模数 MM,请你求出最小的 n > 0n>0,使得 mathrm{fib}(n) mod M = 0, mathrm{fib}(n + 1) mod M = 1fib(n)modM=0,fib(n+1)modM=1。

    输入输出格式

    输入格式:

    输入一行一个正整数 MM。

    输出格式:

    输出一行一个正整数 nn。

    输入输出样例

    输入样例#1: 复制
    2
    输出样例#1: 复制
    3
    输入样例#2: 复制
    6
    输出样例#2: 复制
    24

    说明

    样例 1 解释

    斐波拉契数列为 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, cdots0,1,1,2,3,5,8,13,21,34,⋯,在对 22 取模后结果为 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, cdots0,1,1,0,1,1,0,1,1,0,⋯。

    我们可以发现,当 n = 3n=3 时,f(n) mod 2= 0, f(n + 1) mod 2 = 1f(n)mod2=0,f(n+1)mod2=1,也就是我们要求的 nn 的最小值。

    数据范围

    对于 30\%30% 的数据,M leq 18M18;

    对于 70\%70% 的数据,M leq 2018M2018;

    对于 100\%100% 的数据,2 leq M leq 706150=2M706150=0xAC666

    提示

    如果你还不知道什么是取模 (mod)(mod),那我也很乐意告诉你,模运算是求整数除法得到的余数,也就是竖式除法最终「除不尽」的部分,也即a mod M =k iff a = bM + k (M > 0, 0 leq k < M)amodM=ka=bM+k (M>0,0k<M)其中 a, b, ka,b,k 都是非负整数。

    如果你使用 C / C++,你可以使用 % 来进行模运算。

    如果你使用 Pascal,你可以使用 mod 来进行模运算。

    题解

    如果这次 NOIp 是你的终点,那么祝你的 OI 回忆宛若繁星般璀璨。

    哈哈哈哈为什么要一上来就放催泪弹啊一点都不感动嘤嘤嘤嘤


    一开始淡定的打表找规律,发现跟因子有些关系,大概就是对很多数而言是质因子的f乘起来再乘反复出现的质因子之类......

    然后不想肝了挂了个机跑1~706150的答案,记了个最大值,好像最大值只是个211多少的七位数......

    那还规律个鬼啊,暴力啊!

     1 /*
     2 qwerta 
     3 P4994 终于结束的起点 Accepted 
     4 100
     5 代码 C++,0.25KB
     6 比赛 【LGR-055】洛谷11月月赛
     7 提交时间 2018-11-04 09:08:05
     8 耗时/内存 70ms, 808KB
     9 */
    10 #include<iostream>
    11 #include<cstdio>
    12 #include<cmath>
    13 using namespace std;
    14 int main()
    15 {
    16     int m;
    17     scanf("%d",&m);
    18     int f0=1,f1=1;
    19     for(long long n=2;;++n)
    20     {
    21         int x=(f0+f1)%m;
    22         if(f1==0&&x==1)
    23         {
    24             cout<<n;
    25             break;
    26         }
    27         f0=f1;
    28         f1=x;
    29     }
    30     return 0;
    31 }
  • 相关阅读:
    POJ1806 Manhattan 2025
    POJ1258 AgriNet【最小生成树】
    POJ1789 Truck History【最小生成树】【终于AC了】
    memset的用法
    HDOJ1106 排序
    POJ2965
    414某OJ竞赛题
    HDOJ1745 I hate it【线段树】
    HDOJ2795 Billboard【线段树】
    蓝桥杯o(︶︿︶)o 唉
  • 原文地址:https://www.cnblogs.com/qwerta/p/9905300.html
Copyright © 2011-2022 走看看