1005:取余,循环,找规律

Problem Description

A number sequence is defined as follows:
f(1) =
1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.
Given A, B, and
n, you are to calculate the value of f(n).

Input

The input consists of multiple test cases. Each test case contains 3 integers A, B and n on a single line (1 <= A, B <= 1000, 1 <= n <= 100,000,000). Three zeros signal the end of input and this test case is not to be processed.

Output

For each test case, print the value of f(n) on a single line.

Sample Input

1 1 3

1 2 10

0 0 0

Sample Output

2

5

1.必然会出现循环

这是基于下面事实(*不太懂*):

1. R(n+2)=F(n+2) mod P=(F(n+1)+F(n)) mod P=(F(n+1) mod p +F(n) modp) mod p

2. 斐波那契数列的最大公约数定理:gcd(F(m),F(n))=F(gcd(m,n))

最大公约数定理表明如果F(k)能被N整除,则F(ik)也能被N整除,这就表明了斐波那契数列所含因子的周期性,下面列举:

因子:2,3,4,5, 6,7,8, 9,10,11,12

周期:3,4,6,5,12,8,6,12,15,10,12

我们称所生成的序列为剩余序列,那么一旦出现某个F(k) 能被N整除(这需证明我的一个猜想:对于任意素数P,F(P),F(P-1)和F(P+1)三个中定有一个能被P整除),以后F(ik)都能被N整除,亦即剩余序列周期地出现0,下一个剩余序列值为N-1种可能,总会重复,有两个相邻的重复该序列就一定重复,亦即具有周期性。

这个周期叫做皮萨诺周期

2.正确思路

因为mod7的关系,而且f(1)=f(2)=1,所以f(n)的值是循环分布的,而且一定会回到f(n-1)=f(n)=1。

并且还可以得出,这个循环不大于49,因为相邻连个f只有7种取值,这样f(n-1)和f(n)共有49种组合。

所以,只要找出循环因子即可,寻找方法正是根据f(n-1)=f(n)再次出现的地方来计算。

可以首先为这个题目写一个测试程序,设定一个a b n(n比较小时)的值,看看输出规律。

只要找到k使得f(k-1) = f(n-1),f(k-2)=f(n-2);特别地,当k等于2时就可以了,因为f(1),f(2)是循环的开始。

又因为f(n-1),f(n-2)都只能取0到6共7个数,因此有49种组合方式,也就是说50内必然可以找到满足条件的k,就是循环周期小于50。

3.解题思路:

1.n的数值很大,这类数值很大的问题一般都有规律,找出循环节(周期)是关键;

2.找规律,这道题是从 f(1) = 1 和 f(2) = 1 开始,然后依次模7,可知 f(n) 只有7种情况,所以两数相邻只有7*7=49种;

3.所以从 f(1) 到 f(49) 必会出现相邻两个 f(m-1) = 1 , f(m) = 1,所以 f(n) 为周期函数,49为其一个周期。

3.实现代码:

 1 #include <iostream>
 2 using namespace std;
 3
 4 int A,B;
 5
 6 int f(int n)
 7 {
 8     if(n==1||n==2)
 9         return 1;
10     else{
11          return ((A * f(n - 1) + B * f(n - 2)) % 7);
12
13     }
14 }
15
16 int main()
17 {
18     long long n;
19     while(1)
20     {
21         cin>>A;
22         cin>>B;
23         cin>>n;
24         if(A==0 && B==0 && n==0)
25             break;
26         else
27         {
28             n %= 49;
29             cout<<f(n)<<endl;
30         }
31     }
32     return 0;
33 }
时间: 2024-12-13 00:51:17

1005:取余,循环,找规律的相关文章

ACM_同余+暴力找规律

小光的忧伤 Time Limit: 2000/1000ms (Java/Others) Problem Description: 锴神:我尊重作者原意,你们出什么我就加什么.于是小光打了道水题(也就是这道),但是呢比赛的时候拿着自己的标程却AC不了,最后只能尴尬地打表!!为毛呢?!请你来看看这道题,为了缓解小光的尴尬,他决定不告诉你样例输入输出,神马?!没有输入输出?对,就是这么贼! Input: 多组数据,输入n,求(1^n+2^n+3^n+4^n)mod 5,其中n范围是[10^5,10^(

USTC OJ — 1005 Booklet Printing(找规律,简单题)

1. 题目描述 本题的描述比较凌乱,不过题目给出的测试数据比较好,可以推测出题目的意思. 下面是题目给出的测试数据: 2. 算法设计 每一张纸可以印4页,从第一张纸开始往后遍历,分别设置每张纸上需要印制的页码即可. 以第二组测试数据为例: 共需要印刷的页数n = 14,那需要的纸张数sheet_num = n / 4 + 1 = 4. sheet_num = 4时,共可以印4*4 = 16页.实际只需要印14页,那就有两页空着,需要印上Black. 观察相邻的两页纸上印刷的页码,如下: 页码从前

hdu1005 超规模&amp;gt;&amp;gt;找规律&amp;gt;&amp;gt;有限次数循环

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1005 //由于题目有两项在变,一项有7种可能,全部共同拥有49种情况. /* 超规模>>算法优化 >>找规律>>规律变化 >>有限次数内循环>>找到变化范围 */ int main() { int f[51]={49,1,1}; int a,b,n,i; while( cin>>a>>b>>n,a+b+n){ fo

找规律/hdu 1005 Number Sequence

题意 给出a,b,n,已知f[1]=f[2]=1,f[i]=(a*f[i-1]+b*f[i-2]) mod 7 输出f[n] 数据范围 1 <= A, B <= 1000, 1 <= n <= 100,000,000 分析 首先,直接求..肯定是不行的 会tle 会mle 但是可以找到规律,例如对a=1,b=1 这个数据,有 f1=1 f2=1 f3=3 f4=5 f5=4 f6=0 f7=1 f8=1 f9=3 f10=5 f11=4 f12=0 ???? 我们会发现有一定的规律

HDU1799 循环多少次?【找规律】

循环多少次? Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2821    Accepted Submission(s): 1022 Problem Description 我们知道,在编程中,我们时常需要考虑到时间复杂度,特别是对于循环的部分.例如, 如果代码中出现 for(i=1;i<=n;i++) OP ; 那么做了n次OP运算

取石子 找规律

1 取石子 1.1 Background CZR是个智障小朋友,朌近他家装修,多出来很多石子,所以他决定 用这个来做一个游戏. 因为这是个双人游戏,所以他又找来了LSQ. 1.2 Description 游戏规则很简单: 1. 地上有很多石子,丌共n个,两个人轮流从地上拿走买部分石子: 2. 每个人每仏次必须要拿走石子,但是拿走的石子个数必须大于等 于1,小于等于k: 3. 游戏朏式始CZR先拿,拿到地上朊后一个石子的人获胜. 然而CZR的数学不太好,所以他想知道对于这个游戏他一定能获胜 吗?

【55测试】【字符串】【栈】【找规律】

集训第二天,额,考崩了. 第一题 hao 大意:(这个名字就不要在意了,其实是祖玛游戏) 模拟祖玛游戏的模式,给一个'A'~'Z'的字符串,然后有t个插入操作为 “ 添加后的在原字符串的位置 x  插入元素 c ”,字符串中有超过或等于 3 个相同的字符,则被消除,输出每次操作后剩余的字符串,如果为空,则输出“-”. 样例: ACCBA                     输出:  ABCCBA 5   AABCCBA 1 B AABBCCBA 0 A - 2 B A 4 C 0 A 解:

2016(胡赛复现)_大数找规律

Time Limit: 5 Sec  Memory Limit: 128 MB Description 给出正整数 n 和 m,统计满足以下条件的正整数对 (a,b) 的数量: 1. 1≤a≤n,1≤b≤m;  2. a×b 是 2016 的倍数. Input 输入包含不超过 30 组数据. 每组数据包含两个整数 n,m (1≤n,m≤109). Output 对于每组数据,输出一个整数表示满足条件的数量. Sample Input 32 63 2016 2016 1000000000 1000

hdu 1021 斐波那契2,找规律

背景:暴力必定超数据结构范围,因为斐波那契类型数列,成指数形式爆炸增长.故写了数据发现取余30不影响结果. 学习:1.数论类题可以写出几组数据找规律,猜结论. 我的代码: #include<stdio.h> int str[1000009] = { 7, 11 }; int main() { int n; for (int i = 2; i <=1000000; i++){ str[i] = (str[i - 1] + str[i - 2])% 30; } while (scanf(&q