SGU 181.X-Sequence

时间限制:0.5s

空间限制:4M

题意

       令X0=A

          Xi=(a*Xi-1^2,b*Xi-1+c)%m;

          求Xk,(0<=k<=109),(0<=a,b<=100),(1<m<1000);


Solution:

                题目的关键在于m的范围,1000的范围显然是会在取余后出现循环的。

                只要得出循环的数列的长度以及它的每一个数,和任意一个循环的起点位置。就可以算出X值。

                要注意的是X是不对m取余的,还有当X0很大时,计算X1 的中间量是有可能超过int范围的。

code:

#include <iostream>
#include <string>
#include <cstring>
#include <vector>
using namespace std;
const int INF = 111111;
vector<int> ans;
int f[INF];
long long  x, a, b, c, m, k, t;
inline long long  get (long long x) {
	return (a * x * x  + b * x  + c) % m;
}
int main() {
	cin >> x >> a >> b >> c >> m >> k;
	//找到第一次循环结束的地方,即第二次循环开始的地方
	for (t = 0; !f[x]; x = get (x), t++) {
		f[x] = 1;
		if (t == k) {
			cout << x;
			return 0;
		}
	}
	k -= (t-1);//从循环起点算起的K的新位置
     //得到循环数组
	memset (f, 0, sizeof f);
	for (t = 0; !f[x];) {
		f[x] = 1;
		ans.push_back (x);
		x = get (x), t++;
	}
	//找到k在循环节里的位置并输出
	k = k % t - 1;
	if (k < 0) k = t - 1;
	cout << ans[k];
	return 0;
}

  

原文地址:https://www.cnblogs.com/keam37/p/3849473.html