/ WALL // Wall // Author: Constantine Sokol // Complexity : O( M ) // Expected Verdict: AC #include #include #include using namespace std; const int maxn = 1000000000; const int maxm = 524288 + 5; int n, m, d[ maxm ], visited[ maxm ], coefficient[ maxm ]; long long h, w; int a, b, x; vector< int > order; void solve1() { scanf("%lld", &h); scanf("%d", &n); for ( int i = 0; i < n; i++ ) { long long x; scanf("%lld", &x); w = x; } long long area = w * h; printf("%lld.%d\n", area / 2, area % 2 ? 5 : 0 ); } int generate_next( int x ) { return (int)( ( (long long)a * x + b ) % m ); } void solve_testcase() { scanf("%lld", &h); scanf("%d%d", &n, &m); scanf("%d%d%d", &a, &b, &x); for ( int i = 0; i < m; i++ ) scanf("%d", &d[i]); memset( visited, -1, sizeof( visited ) ); memset( coefficient, 0, sizeof( coefficient ) ); order.clear(); w = 0; bool flag = false; for ( int i = 2; i <= n; ) { if ( visited[ x ] == -1 || flag ) { order.push_back( x ); visited[ x ] = i; coefficient[ x ] += 1; x = generate_next( x ); i += 1; continue; } int left = n - i + 1; int cycle_length = i - visited[ x ]; int number = left / cycle_length; for ( int j = 0; j < cycle_length; j++ ) { coefficient[ order.back() ] += number; order.pop_back(); } i += cycle_length * number; flag = true; } for ( int i = 0; i < m; i++ ) w += (long long)coefficient[i] * d[i]; long long area = w * h; printf("%lld.%d\n", area / 2, area % 2 ? 5 : 0 ); } int main() { int T; scanf("%d", &T); while ( T-- ) solve_testcase(); return 0; }