题目描述:传送门
思路:
本题其实是一道数学题。
事实上,我们可以列出一个方程:
2
x
×
m
a
x
n
+
∣
S
∣
−
1
=
l
e
n
2^x \times maxn + |S| - 1 = len
2x×maxn+∣S∣−1=len
∣
S
∣
就
是
字
符
串
S
的
长
度
,
m
a
x
n
为
出
现
次
数
|S|就是字符串S的长度,maxn为出现次数
∣S∣就是字符串S的长度,maxn为出现次数
得
:
现
已
知
l
e
n
,
∣
S
∣
,
求
x
得:现已知len, |S|, 求x
得:现已知len,∣S∣,求x
将
方
程
变
形
得
:
将方程变形得:
将方程变形得:
2
x
=
l
e
n
+
1
−
∣
S
∣
m
a
x
n
2^x = \frac{len +1 - |S|}{maxn}
2x=maxnlen+1−∣S∣
x
=
l
o
g
2
l
e
n
+
1
−
∣
S
∣
m
a
x
n
x = {log}_{2}^{\frac{len +1 - |S|}{maxn}}
x=log2maxnlen+1−∣S∣
于是,我们得出答案。
#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
template < typename T > void read(T &x)
{
int f = 1;x = 0;char c = getchar();
for (;!isdigit(c);c = getchar()) if (c == '-') f = -f;
for (; isdigit(c);c = getchar()) x = x * 10 + c - '0';
x *= f;
}
int c[1005];
int main()
{
//freopen(".in", "r", stdin);
//freopen(".out", "w", stdout);
string s;
long double l;
int maxn = INT_MIN;
memset(c, 0, sizeof(c));
cin >> s;
cin >> l;
int len = s.size();
if(len >= l)
{
cout << 0 << endl;
return 0;
}
for(int i = 0;i < len;i++)
{
c[int(s[i])]++;
maxn = max(maxn, c[int(s[i])]);
}
if(l - maxn <= len)
{
cout << 1 << endl;
return 0;
}
l -= double(len);
long double t = double(maxn);
l /= t;
l += 1;
double ans = log(l) / log(2);
if(ans == floor(ans)) cout << ans << endl;
else cout << ceil(ans) << endl;
return 0;
}