题目链接:
http://acm.sgu.ru/problem.php?contest=0&problem=181
题意:Let {xi} be the infinite sequence of integers:
1) x 0 = A; 2) x i = (alpha * x i-1^2 + beta * x i-1 + gamma) mod M, for i >= 1.Your task is to find xk if you know A, alpha, beta, gamma, M and k.
A (1 <= A <= 10000), alpha (0 <= alpha <= 100), beta (0 <= beta <= 100), gamma (0 <= gamma <= 100), M (1 <= M <= 1000), k (0 <= k <= 10^9)
题解:意识到模数范围只有1000,所以可以暴力寻找循环节 注意循环节不一定是从0或者1开始
做题状况:wa了几次,wa5是因为自己是傻逼写错个字母 wa39还是因为自己傻逼总之我就是傻逼
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
using namespace std;
const int size = 1010;
int A, a, b, c, M, k;
int hash[size], len, begin, ans;
void work() {
map<int, int> mp;
int tmp = A; mp[A] = 1;
for (int i = 2; i < size; i++) {
tmp = ((long long)a*tmp*tmp+b*tmp+c)%M;
if (mp[tmp]) {
begin = mp[tmp] - 1; len = i - mp[tmp]; break;
}
mp[tmp] = i;
}
}
int main() {
freopen("p181", "r", stdin);
scanf("%d%d%d%d%d%d",&A,&a,&b,&c,&M,&k);
work();
if (k < begin) {
ans = A;
for (int i = 1; i <= k; i++)
ans = ((long long)a*ans*ans+b*ans+c)%M;
printf("%d\n", ans);
} else {
k -= begin; k %= len; ans = A;
for (int i = 1; i <= begin + k; i++)
ans = ((long long)a*ans*ans+b*ans+c)%M;
printf("%d\n", ans);
}
return 0;
}