题目大意
题目描述
给定一个数组 a a a ,定义 f ( a ) f(a) f ( a ) 为将 a a a 划分成一个或多个连续子数组的方案数,需满足以下条件:
每个元素恰好属于一个子数组。
所有子数组的元素和都相等。
例如,对于 a = [ 1 , 1 ] a=[1,1] a = [ 1 , 1 ] ,f ( a ) = 2 f(a)=2 f ( a ) = 2 ,因为有两种合法的划分方案:
[ 1 , 1 ] [1,1] [ 1 , 1 ] ,此时唯一的子数组和为 2 2 2 。
[ 1 ] + [ 1 ] [1]+[1] [ 1 ] + [ 1 ] ,此时两个子数组和均为 1 1 1 。
给定两个整数 x x x 和 y y y 。你需要构造一个长度为 x + y x+y x + y 的数组 a a a ,其中包含 x x x 个 1 1 1 和 y y y 个 − 1 -1 − 1 。
你需要求出在所有合法的数组 a a a 中,f ( a ) f(a) f ( a ) 的最小值 ,并将该最小值对 676767677 676767677 6 7 6 7 6 7 6 7 7 取模后输出。同时,你需要输出一个能达到该最小值的数组构造方案。
注意 :你需要最小化的是 f ( a ) f(a) f ( a ) 本身,然后将这个最小值对 676767677 676767677 6 7 6 7 6 7 6 7 7 取模,而不是去最小化 f ( a ) m o d 676767677 f(a) \bmod 676767677 f ( a ) m o d 6 7 6 7 6 7 6 7 7 的结果。
输入格式
第一行包含一个整数 t t t (1 ≤ t ≤ 1 0 4 1 \le t \le 10^4 1 ≤ t ≤ 1 0 4 ),表示测试用例的数量。
接下来每个测试用例包含一行,包含两个整数 x x x 和 y y y (0 ≤ x , y ≤ 2 ⋅ 1 0 5 0 \le x, y \le 2 \cdot 10^5 0 ≤ x , y ≤ 2 ⋅ 1 0 5 ),保证 x + y ≥ 1 x+y \ge 1 x + y ≥ 1 。
保证所有测试用例中 x x x 的总和与 y y y 的总和均不超过 2 ⋅ 1 0 5 2 \cdot 10^5 2 ⋅ 1 0 5 。
输出格式
对于每个测试用例,输出两行:
第一行输出 f ( a ) f(a) f ( a ) 的最小值对 676767677 676767677 6 7 6 7 6 7 6 7 7 取模的结果。
第二行输出一个达到该最小值的数组 a a a 的元素(用空格分隔)。
样例输入
样例输出
1 2 3 4 5 6 7 8 2 1 1 1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 1 -1 2 -1 -1 -1 1
样例解释
在第一个测试用例中,x = 2 x=2 x = 2 且 y = 0 y=0 y = 0 。唯一可能的数组是 a = [ 1 , 1 ] a=[1,1] a = [ 1 , 1 ] ,正如题目描述中所解释的,此时 f ( a ) = 2 f(a)=2 f ( a ) = 2 。
在第二个测试用例中,x = 1 x=1 x = 1 且 y = 1 y=1 y = 1 。一个能使 f ( a ) f(a) f ( a ) 最小化的合法数组是 a = [ 1 , − 1 ] a=[1,-1] a = [ 1 , − 1 ] 。此时 f ( a ) = 1 f(a)=1 f ( a ) = 1 ,因为唯一能使所有子数组和相等的划分方式就是不进行任何分割(即 [ [ 1 , − 1 ] ] [[1,-1]] [ [ 1 , − 1 ] ] ,子数组和为 0 0 0 )。
思路讲解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 void Solve () { ll X, Y; cin >> X >> Y; vector<ll> A (X + Y + 2 ) ; for (int i = 1 ; i <= X; ++i) { A[i] = 1 ; } for (int i = 1 ; i <= Y; ++i) { A[i + X] = -1 ; } ll s = llabs (X - Y); ll ans = 1 ; if (s != 0 ) { ans = 0 ; for (ll d = 1 ; d * d <= s; ++d) { if (s % d == 0 ) { ++ans; if (d * d != s) ++ans; } } } cout << ans << "\n" ; for (int i = 1 ; i <= X + Y; ++i) { cout << A[i] << " " ; } cout << "\n" ; }
AC代码
AC
https://codeforces.com/contest/2211/submission/368623804
源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 #include <bits/stdc++.h> #define all(vec) vec.begin(),vec.end() #define lson(o) (o<<1) #define rson(o) (o<<1|1) #define SZ(a) ((long long) a.size()) #define debug(var) cerr << #var <<" = [" <<var<<"]" <<"\n" ; #define debug1d(a) \ cerr << #a << " = [" ; \ for (int i = 0; i < (int)(a).size(); i++) \ cerr << (i ? ", " : "" ) << a[i]; \ cerr << "]\n" ; #define debug2d(a) \ cerr << #a << " = [\n" ; \ for (int i = 0; i < (int)(a).size(); i++) \ { \ cerr << " [" ; \ for (int j = 0; j < (int)(a[i]).size(); j++) \ cerr << (j ? ", " : "" ) << a[i][j]; \ cerr << "]\n" ; \ } \ cerr << "]\n" ; #define cend cerr<<"\n-----------\n" #define fsp(x) fixed<<setprecision(x) using namespace std;using ll = long long ;using ull = unsigned long long ;using DB = double ;using i128 = __int128;using CD = complex<double >;static constexpr ll MAXN = (ll) 1e6 + 10 , INF = (1ll << 61 ) - 1 ;static constexpr ll mod = 676767677 ;static constexpr double eps = 1e-8 ;const double PI = acos (-1.0 );ll lT, testcase; void Solve () { ll X, Y; cin >> X >> Y; vector<ll> A (X + Y + 2 ) ; for (int i = 1 ; i <= X; ++i) { A[i] = 1 ; } for (int i = 1 ; i <= Y; ++i) { A[i + X] = -1 ; } ll s = llabs (X - Y); ll ans = 1 ; if (s != 0 ) { ans = 0 ; for (ll d = 1 ; d * d <= s; ++d) { if (s % d == 0 ) { ++ans; if (d * d != s) ++ans; } } } cout << ans << "\n" ; for (int i = 1 ; i <= X + Y; ++i) { cout << A[i] << " " ; } cout << "\n" ; } signed main () { ios::sync_with_stdio (false ); cin.tie (nullptr ); cout.tie (nullptr ); #ifdef LOCAL cout.setf (ios::unitbuf); #endif cin >> lT; for (testcase = 1 ; testcase <= lT; ++testcase) Solve (); return 0 ; }
心路历程(WA,TLE,MLE……)