随机生成 n n n 个 0 , 1 0,1 0,1 向量,使这 n n n 个为一组,求这 n n n 个向量独立的概率。
f ( 1 ) f(1) f(1) 的时候:
可以选择 0 , 1 0 ,1 0,1两种,只有 1 1 1 符合, 0 0 0 和任何向量都不线性无关。所以 f ( 1 ) = 1 2 f(1)=\frac{1} {2} f(1)=21
f ( 2 ) f(2) f(2) 的时候:
有
0 , 0 0,0 0,0
01 0 1 01
1 , 0 1,0 1,0
1 , 1 1,1 1,1
01 , 10 , 11 01 ,10 ,11 01,10,11三个组合,他们都是独立的,就是 C 3 2 C_3^2 C32,然后加上顺序就是 A 2 2 A_2^2 A22 一共有 6 6 6 中情况,总情况就是 4 ∗ 4 4*4 4∗4 ,所以 f ( 2 ) = A 2 2 C 3 2 4 ∗ 4 = 6 16 = 3 8 f(2)=\frac{A_2^2C_3^2}{4*4}=\frac{6}{16}=\frac{3}{8} f(2)=4∗4A22C32=166=83
具体公式的推导:
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
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define sd(n) scanf("%d", &n)
#define sdd(n, m) scanf("%d%d", &n, &m)
#define sddd(n, m, k) scanf("%d%d%d", &n, &m, &k)
#define pd(n) printf("%d\n", n)
#define pc(n) printf("%c", n)
#define pdd(n, m) printf("%d %d\n", n, m)
#define pddd(n, m, z) printf("%d %d %d\n", n, m, z)
#define pld(n) printf("%lld\n", n)
#define pldd(n, m) printf("%lld %lld\n", n, m)
#define plddd(n, m, z) printf("%lld %lld %lld\n", n, m, z)
#define sld(n) scanf("%lld", &n)
#define sldd(n, m) scanf("%lld%lld", &n, &m)
#define slddd(n, m, k) scanf("%lld%lld%lld", &n, &m, &k)
#define sf(n) scanf("%lf", &n)
#define sc(n) scanf("%c", &n)
#define sff(n, m) scanf("%lf%lf", &n, &m)
#define sfff(n, m, k) scanf("%lf%lf%lf", &n, &m, &k)
#define ss(str) scanf("%s", str)
#define rep(i, a, n) for (int i = a; i <= n; i++)
#define per(i, a, n) for (int i = a; i >= n; i--)
#define mem(a, n) memset(a, n, sizeof(a))
#define debug(x) cout << #x << ": " << x << endl
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second
#define ce i == n ? '\n' : ' '
#define mod(x) ((x) % MOD)
#define gcd(a, b) __gcd(a, b)
#define lowbit(x) (x & -x)
typedef pair<int, int> PII;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
const int MOD = 1e9 + 7;
const double eps = 1e-9;
const ll INF = 0x3f3f3f3f3f3f3f3fll;
const int inf = 0x3f3f3f3f;
inline int read()
{
int ret = 0, sgn = 1;
char ch = getchar();
while (ch < '0' || ch > '9')
{
if (ch == '-')
sgn = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')
{
ret = ret * 10 + ch - '0';
ch = getchar();
}
return ret * sgn;
}
inline void Out(int a) //ê?3?ía1ò
{
if (a > 9)
Out(a / 10);
putchar(a % 10 + '0');
}
ll gcd(ll a, ll b)
{
return b == 0 ? a : gcd(b, a % b);
}
ll lcm(ll a, ll b)
{
return a * b / gcd(a, b);
}
///快速幂m^k%mod
ll qpow(ll x, ll n, ll mod)
{
ll res = 1;
while (n)
{
if (n & 1)
res = (res * x) % mod;
x = x * x % mod, n >>= 1;
}
return res;
}
一个矩阵的底面积定义为最后一行的数的和,重量定义为所有数的和,给一个正整数矩阵,找一个“压强”最大的可非连续子矩阵。
最大压强肯定就是单独的一列最大,枚举每个底面就好了。
const int N = 1e5 + 50;
int n, m;
int a[500][500];
int main()
{
int t;
sd(t);
while (t--)
{
sdd(n, m);
rep(i, 1, n)
{
rep(j, 1, m)
{
sd(a[i][j]);
}
}
double ans = 0;
rep(j, 1, m)
{
ll res = 0;
rep(i, 1, n)
{
res += a[i][j];
ans = max(ans, res * 1.0 / (1.0 * a[i][j]));
}
}
printf("%.8lf\n", ans);
}
return 0;
}
构造一个长度为 n n n 且元素为 1 n 1~n 1 n 序列的序列 P P P,并且满足其中有长度为 i i i 的连续子区间的和 % n = = k \% n == k %n==k。若无法构造就输出 “ − 1 ” “-1” “−1”,输出任意一种方案。
n n n 为偶数时,显然所有子区间的和 % n = = k \% n == k %n==k 必须满足的话,意味着 n n n 个元素的和 % n = = k \% n == k %n==k (即 ( n ( n + 1 ) / 2 ) % n = = k ) (n(n+1)/2)\%n==k) (n(n+1)/2)%n==k),转换可知 k k k 必定为 n 2 \frac{n}{2} 2n。若满足此条件便可构造 P = n , 1 , n − 1 , 2 , n − 2 , … P={n,1,n-1,2,n-2,…} P=n,1,n−1,2,n−2,…,反之连 i = = n i == n i==n 都不满足必定不可能构造成功。
n为奇数时,知道 n n n 个元素的和 % n = = 0 \% n == 0 %n==0,那么 k k k 必须为 0 0 0 ,可构造 P = n , n 2 , 1 , n − 1 , 2 , n − 2 , … P={n,\frac{n}{2},1,n-1,2,n-2,…} P=n,2n,1,n−1,2,n−2,…,若 k k k 不为 0 0 0 便没办法构造成功。
const int N = 5e5 + 50;
int n, k;
vector<int> ans;
int main()
{
sdd(n, k);
if (n & 1)
{
if (k)
{
puts("-1");
}
else
{
ans.pb(n);
rep(i, 1, n)
{
if (i >= n - i)
break;
ans.pb(i);
ans.pb(n - i);
}
}
}
else
{
if (k * 2 != n)
puts("-1");
else
{
ans.pb(n);
ans.pb(k);
rep(i, 1, n)
{
if (i >= n - i)
break;
ans.pb(i);
ans.pb(n - i);
}
}
}
for (auto i : ans)
printf("%d ", i);
printf("\n");
return 0;
}