蓝桥杯算法:斐波那契求Fn除以10007的余数

news/2025/1/31 9:22:44/

时间限制: 1.0s 内存限制: 512.0MB

【问题描述】
Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。
<此题禁止使用数组容器等数据结构>

【输入格式】
输入一行包含一个整数 n。
【输出格式】
输出一行,包含一个整数,表示满足条件的数的和。
【样例输入】
22
【样例输出】
7704
【评测用例规模与约定】
对于所有评测用例,1 ≤ n ≤ 1,000,000。

当n为35时,也就是计算第35个斐波那契数.

我用了三种方式来测试规律,第一种是普通的斐波那契数列.
第二种是有限变量来做斐波那契数列,我这里%9来测试.
第三种是用一个temp变量来做斐波那契数列求余问题.

		Scanner input = new Scanner(System.in);int n = input.nextInt();int l1 = 1;int l2 = 1;// 先打印出正确的斐波那契数for(int i = 2;i < n;i++) {l2 = l1 + l2;l1 = l2 - l1;System.out.print(l2 + " ");}System.out.println();l1 = 1;l2 = 1;// 用有限变量做出这道题for(int i = 2;i < n;i++) {l2 = l1 + l2;l1 = l2 - l1;l2 %= 10007;System.out.print(l2 + " ");}System.out.println();l1 = 1;l2 = 1;// 用中间变量做出这道题for(int i = 2;i < n;i++) {int temp = l2;l2 = l1 + l2;l2 %= 10007;l1 = temp;System.out.print(l2 + " ");}// 输出(%9,留25个数):
// 可以发现,第一排的数%9之后,就是第二排和第三排的数
2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 121393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 
2 3 5 8 4 3 7 1 8 0 8 8 7 6 4 1 5 6 2 8 1 0 1 1 2 3 5 8 4 3 7 1 8 
2 3 5 8 4 3 7 1 8 0 8 8 7 6 4 1 5 6 2 8 1 0 1 1 2 3 5 8 4 3 7 1 8 

如果我们直接算出Fn,然后让Fn来除以10007的话,也可以,但是这个数太大了,需要用BigInteger来存,也很耗费时间,所以我们采用了这种方式.

接下来的一个问题是,为什么让每一个数%10007,结果却没变呢?

这是因为取余运算中存在定理:n%p = (a + b) % p = (a % p + b % p) % p.

这个过程用中间变量的这个做法来解释,更好说明一些.
我们最终求的那个斐波那契数Fn % p实际上就是(l1 + l2) % p,也就是(l1 % p + l2 % p) % p.
假设我们现在有三个数A B C
l1 为A,l2为B.A + B = C
temp等于此时的l2,也就是B % p.
然后l2 = A + B = C. 再除以10007求余. 此时l2 = C % p
而l1 = temp = B % p.
而假如再有一个D的话,
l2 = (l1 + l2) % p = (B % p + C % p ) % p

这个时候不就变成了(l1 % p + l2 % p) % p. 这种写法了吗?

		l1 = 1;l2 = 1;// 用中间变量做出这道题for(int i = 2;i < n;i++) {int temp = l2;l2 = l1 + l2;l2 %= 10007;l1 = temp;System.out.print(l2 + " ");}

http://www.ppmy.cn/news/666503.html

相关文章

素数环-蓝桥杯

题目描述 有一个整数 n&#xff0c;把从 1 到 n 的数字无重复的排列成环&#xff0c;且使每相邻的两个数&#xff08;包括首和尾&#xff09;的和都为素数&#xff0c;称为素数环。为了简便起见&#xff0c;我们规定每个素数环都从 1 开始。例如&#xff0c;6 的一个素数环&am…

【蓝桥杯】新型斐波那契数列

蓝桥杯 新型斐波那契数列 问题描述 新型斐波那契数列的第一、二、三项都为1&#xff0c;从第四项起每一项等于前面三项之和&#xff0c;求此数列第n项模m的余数。 输入格式 输入一行为两个整数n、m&#xff0c;用空格隔开。 输出格式 输出一行为新型斐波那契数列第n项模m的余数…

蓝桥杯——ALGO995——24点

通过万岁&#xff01;&#xff01;&#xff01; 题目&#xff1a;就是给你四张扑克牌&#xff0c;然后尽可能的通过加减乘除和括号得到小于等于24的最大值&#xff0c;最大就是24。注意&#xff0c;除法的时候需要判断是不是整除。思路&#xff1a;猛一看&#xff0c;感觉可能…

使用7号电池的科学计算机,新奇:可以用USB充电的5号、7号电池

在大家的日常生活中&#xff0c;电池绝对是的离不开的物件。特别是AA五号电池和AAA七号电池&#xff0c;用途更加广泛&#xff0c;比如在很多家电的遥控器中、玩具、数码产品中&#xff0c;都可以找到他们的身影。为了使用方便&#xff0c;有不少人都会选择使用充电电池。但是充…

Acwing.838.堆排序

基础堆操作 题目 输入一个长度为n的整数数列&#xff0c;从小到大输出前m小的数。 输入格式 第一行包含整数n和m。 第二行包含n个整数&#xff0c;表示整数数列。 输出格式 共—行&#xff0c;包含m个整数&#xff0c;表示整数数列中前m小的数。 数据范围 1 ≤m ≤n ≤…

南孚电池持续领先同行的秘诀——集团数字化转型

注&#xff1a;本文为帆软2021数据生产力大赛获奖案例&#xff0c;未经授权禁止转载。 1 公司简介 福建南平南孚电池有限公司创立于1988年&#xff0c;系国家520户重点企业&#xff0c;国家高新技术企业&#xff0c;外经贸部重点扶持的出口企业&#xff0c;中国电池行业龙头…

互联网日报 | 苏宁家电累计销售突破20亿台;嘀嗒出行推出租车电子发票;钉钉上线“学生号”...

今日看点 ✦ 苏宁宣布&#xff1a;苏宁家电30年累计销售突破20亿台 ✦ 嘀嗒出行上线出租车电子发票&#xff0c;实时关联车内计价器 ✦ 钉钉宣布上线“学生号”&#xff1a;家长领取&#xff0c;孩子使用 ✦ 原中兴手机CEO曾学忠加盟小米&#xff0c;出任集团副总裁、手机部总裁…

5月24号作业

使用fgets计算行数 #include <stdio.h> #include <string.h> #include <errno.h>int main() {FILE *fp;int n0,count0;char Buf[1024];if((fpfopen("./file.txt","r"))NULL) //打开文件{perror("open file");return -1;}whi…