Giả sử chúng ta được cung cấp ba số nguyên n, x, y và z. Chúng ta phải tạo một chuỗi từ các số nguyên đã cho, trong đó mục đầu tiên của chuỗi là (x modulo 2 31 ). Ngoài phần tử đầu tiên, các phần tử khác trong chuỗi a i =(a (i-1) * y + z) modulo 2 31 , trong đó 1 ≤ i ≤ n - 1. Chúng ta phải tìm ra số lượng các số nguyên khác nhau trong dãy chúng ta đã thực hiện.
Vì vậy, nếu đầu vào là n =5, x =1, y =2, z =1, thì đầu ra sẽ là 5.
Các giá trị duy nhất là {1, 3, 7, 15, 31}. Vì vậy, câu trả lời là 5.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- MOD:=2 ^ 31
- Xác định tạm thời mảng
- thay đổi kích thước tạm thời của mảng thành giá trị của MOD
- p:=x mod MOD
- temp [p]:=true
- ans:=1
- để khởi tạo i:=1, khi i
- p:=((p * y) + z) mod MOD
- nếu temp [p] là true, thì -
- Ra khỏi vòng lặp
- tăng ans lên 1
- temp [p]:=true
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
const long long MOD = 2147483648;
int solve(int n, long long x, long long y, long long z) {
vector<bool> temp;
temp.resize(MOD);
long long p = x % MOD;
temp[p] = true;
int ans = 1;
for (int i = 1; i < n; ++i) {
p = ((p * y) + z) % MOD;
if (temp[p])
break;
++ans;
temp[p] = true;
}
return ans;
}
int main() {
cout<< solve(5, 1, 2, 1) <<endl;
return 0;
} Đầu vào
5, 1, 2, 1
Đầu ra
5