1.题目描述:

1175. Strange Sequence

Time limit: 1.0 second
Memory limit: 2 MB
You have been asked to discover some important properties of one strange sequences set. Each sequence of the parameterized set is given by a recurrent formula:
Xn+1 = F(Xn-1, Xn),
where n > 1, and the value of F(X,Y) is evaluated by the following algorithm:
  1. find H = (A1*X*Y + A2*X + A3*Y + A4);
  2. if H > B1 then H is decreased by C until H ≤ B2;
  3. the resulting value of H is the value of function F.
The sequence is completely defined by nonnegative constants A1, A2, A3, A4, B1, B2 and C.
One may easily verify that such sequence possess a property that Xp+n = Xp+q+n for appropriate large enough positive integers p and q and for all n ≥ 0. You task is to find the minimal p and q for the property above to hold. Pay attention that numbers p and q are well defined and do not depend on way minimization is done.

Input

The first line contains seven integers: A1, A2, A3, A4, B1, B2 and C. The first two members of sequence (X1 and X2) are placed at the second line. You may assume that all intermediate values of H and all values of F fit in range [0..100000].

Output

An output should consist of two integers (p and q) separated by a space.

Sample

input output
0 0 2 3 20 5 7
0 1
2 3

2.解题思路

题目要求确定p和q,我们先确定q再确定p,有了q只需要从x1,x2开始逐个尝试就能得出p。如何确定q呢?既然题目说了这个序列以q为循环节,我们可以假定序列在迭代足够多次之后就进入了循环,设这个次数为max。这样迭代max后再从1开始寻找q就可以啦~

3.代码:

#include <iostream>
#define max 300000
using namespace std; int a1,a2,a3,a4,b1,b2,c,x1,x2;
int p,q; int cal(int x, int y) {
int h = a1*x*y+a2*x+a3*y+a4;
if (h > b1) {
while (h > b2) {
h -= c;
}
}
return h;
} void iter(int& x, int& y) {
int tmp = cal(x, y);
x = y;
y = tmp;
} //假定迭代max次后处于稳定状态
//思路:迭代max次;继续迭代找到q;x1,x2迭代q次得到x3,x4;同时迭代直到x1==x3 && x2 == x4,找到p
int main() {
cin >> a1 >> a2 >> a3 >> a4 >> b1 >> b2 >> c >> x1 >> x2;
int i, tmp1, tmp2, tmp3, tmp4;
tmp3 = x1;
tmp4 = x2;
for (i = ; i < max; i++) {
iter(x1, x2);
}
tmp1 = x1;
tmp2 = x2;
q = ;
iter(x1, x2);
while (x1 != tmp1 || x2 != tmp2) {
q++;
iter(x1, x2);
}
tmp1 = tmp3;
tmp2 = tmp4;
iter(tmp1,tmp2);
i = ;
while (i != q) {
i++;
iter(tmp1, tmp2);
}
p = ;
while (tmp1 != tmp3 || tmp2 != tmp4) {
p++;
iter(tmp1, tmp2);
iter(tmp3, tmp4);
}
cout << p << " " << q << endl;
}

4.复杂度:

空间:O(1)

时间:O(p+q+max)

5.心得:

把这道题写出来,是因为我第一次尝试时思路是错的:把<x0,x1>作为一个pair,pos是迭代次数,用一个map<pair,pos> result存储,一直迭代<x0,x1>,递增pos,并把结果存入result,当重复插入时(x.pair == y.pair,x.pos < y.pos),就求出了p,q: p = x.pos, q = y.pos - x.pos。

。。。

没错我当时就是这么写的,然后华丽丽的爆了内存。

这种做法的复杂度:

时间:O(p+q)

空间:O(p+q)

然而根据题目要求,空间限制2M,是很严格的。。以后一定要好好看题目。。

timus 1175. Strange Sequence 解题报告的更多相关文章

  1. 【九度OJ】题目1175:打牌 解题报告

    [九度OJ]题目1175:打牌 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1175 题目描述: 牌只有1到9,手里拿着已经排好序的 ...

  2. USACO Section2.1 Sorting a Three-Valued Sequence 解题报告

    sort3解题报告 —— icedream61 博客园(转载请注明出处)---------------------------------------------------------------- ...

  3. Ducci Sequence解题报告

    A Ducci sequence is a sequence of n-tuples of integers. Given an n-tuple of integers (a1, a2, ... ,  ...

  4. 【LeetCode】842. Split Array into Fibonacci Sequence 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  5. 【LeetCode】60. Permutation Sequence 解题报告(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  6. timus 1180. Stone Game 解题报告

    1.题目: 1180. Stone Game Time limit: 1.0 secondMemory limit: 64 MB Two Nikifors play a funny game. The ...

  7. ACM : HDU 2899 Strange fuction 解题报告 -二分、三分

    Strange fuction Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...

  8. LeetCode: Permutation Sequence 解题报告

    Permutation Sequence https://oj.leetcode.com/problems/permutation-sequence/ The set [1,2,3,…,n] cont ...

  9. USACO Section 2.1 Sorting a Three-Valued Sequence 解题报告

    题目 题目描述 给N个整数,每个整数只能是1,2,或3.现在需要对这个整数序列进行从小到大排序,问最少需要进行几次交换.N(1 <= N <= 1000) 样例输入 9 2 2 1 3 3 ...

随机推荐

  1. jqgrid cellEdit为true的时候,默认选中单元格值的解决方案

    jqgrid cellEdit为true的时候,点击单元格的时候,鼠标在单元格最前面闪. 这时候如果要修改数字内容,非常麻烦.要全选单元格内容,不然不好改. 点击单元格的时候,默认选中单元格值的解决方 ...

  2. volatile与synchronized的区别

    1.锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility). 互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一 ...

  3. 泛型:HashMap的用法--输入字母输出数目

    public static void main(String[] args) { Map <String ,Integer> m =new HashMap<String , Inte ...

  4. convert与int.parse int

    1,convert :适合将object 转换 int:简单数据转换 int.parse:将string类型转换为int 2,convert:对于空值返回0 不会报异常 int.parse:将会抛出异 ...

  5. Apache Spark技术实战之9 -- 日志级别修改

    摘要 在学习使用Spark的过程中,总是想对内部运行过程作深入的了解,其中DEBUG和TRACE级别的日志可以为我们提供详细和有用的信息,那么如何进行合理设置呢,不复杂但也绝不是将一个INFO换为TR ...

  6. selenium webdriver自动化测试

    selenium家族介绍           Selenium IDE:Selenium IDE是嵌入到Firefox浏览器中的一个插件,实现简单的浏览器操作的录制与回放功能.   Selenium ...

  7. opengl中对glOrtho()函数的理解

    glOrtho是创建一个正交平行的视景体. 一般用于物体不会因为离屏幕的远近而产生大小的变换的情况.比如,常用的工程中的制图等.需要比较精确的显示. 而作为它的对立情况, glFrustum则产生一个 ...

  8. Image模块

    1.创建一个新的图片 Image.new(mode,size) Image.new(mode,size,color) 2.层叠图片 层叠两个图片,img1和img2,alpha是一个介于[0,1]的浮 ...

  9. iOS应用程序的生命周期

    iOS应用程序一般都是由自己编写的代码和系统框架(system frameworks)组成,系统框架提供一些基本infrastructure给所有app来运行,而你提供自己编写的代码来定制app的外观 ...

  10. grafana + influxdb + telegraf , 构建性能监控平台

    1.安装平台 1).grafana , 访问各类数据源 , 自定义报表.显示图表等等 , 用于提供界面监控 , 默认端口为3000 , 默认登陆信息admin wget https://grafana ...