variantsCount.cpp
· 1014 B · C++
Ham
#include <bits/stdc++.h>
using namespace std;
#define ll long long
long variantsCount(int n, long long s0, long long k, long long b, long long m, long long a) {
// Generate all n side lengths
vector<long long> sides(n);
sides[0] = s0;
for (int i = 1; i < n; i++) {
sides[i] = ((k * sides[i - 1] + b) % m) + 1 + sides[i - 1];
}
// Sort sides for binary search
sort(sides.begin(), sides.end());
int count = 0;
// Use binary search to count pairs
for (int i = 0; i < n; i++) {
long long max_side = a / sides[i];
// Find the position where sides[j] exceeds max_side
auto j = upper_bound(sides.begin(), sides.end(), max_side) - sides.begin();
count += j; // All elements in sides[0:j] are valid for sides[i] * sides[j] <= a
}
return count;
}
int main() {
int n = 5;
long long s0 = 3, k = 2, b = 1, m = 100, a = 100;
int result = variantsCount(n, s0, k, b, m, a);
cout << result << endl;
return 0;
}
1 | #include <bits/stdc++.h> |
2 | using namespace std; |
3 | #define ll long long |
4 | |
5 | long variantsCount(int n, long long s0, long long k, long long b, long long m, long long a) { |
6 | // Generate all n side lengths |
7 | vector<long long> sides(n); |
8 | sides[0] = s0; |
9 | for (int i = 1; i < n; i++) { |
10 | sides[i] = ((k * sides[i - 1] + b) % m) + 1 + sides[i - 1]; |
11 | } |
12 | |
13 | // Sort sides for binary search |
14 | sort(sides.begin(), sides.end()); |
15 | int count = 0; |
16 | |
17 | // Use binary search to count pairs |
18 | for (int i = 0; i < n; i++) { |
19 | long long max_side = a / sides[i]; |
20 | // Find the position where sides[j] exceeds max_side |
21 | auto j = upper_bound(sides.begin(), sides.end(), max_side) - sides.begin(); |
22 | count += j; // All elements in sides[0:j] are valid for sides[i] * sides[j] <= a |
23 | } |
24 | |
25 | return count; |
26 | } |
27 | |
28 | int main() { |
29 | int n = 5; |
30 | long long s0 = 3, k = 2, b = 1, m = 100, a = 100; |
31 | |
32 | int result = variantsCount(n, s0, k, b, m, a); |
33 | cout << result << endl; |
34 | |
35 | return 0; |
36 | } |
37 |