B 01 串的熵
对于一个长度为 的 串 ,香农信息熵的定义为 ,其中 表示在这个 串中 和 出现的占比。
比如,对于 来说,信息熵 。
对于一个长度为 的 串,如果其信息熵为 , 且 出现次数比 少,那么这个 串中 出现了多少次?
思路
很难通过信息熵来逆推出现的次数(不懂信息熵
故根据暴力杯传统, 直接枚举所有长度为 23333333 的01串可能, 计算他们每一个的信息熵, 如果等于 , 且 出现的次数比 少, 就输出当前串。
math库中有一个求以2为底的log函数:(比赛时候查帮助文档没找到)
log2()
直接按照公式枚举1的个数即可:
// https://www.cnblogs.com/kiddingma/p/17299464.html
#include <iostream>
#include <cstring>
#include <algorithm>
#include <string>
#include <cmath>
using namespace std;
double eps = 1E-4;
int main()
{
auto get = [&](int x, int y)
{
double one = 1.0 * x / (1.0 * (x + y));
double zero = 1.0 * y / (1.0 * (x + y));
return -(x * one * log2(one) + y * zero * log2(zero));
};
for (int i = 0; i <= 23333333; i++)
{
if (abs(get(i, 23333333 - i) - 11625907.5798) <= eps)
{
cout << i << endl;
break;
}
}
return 0;
}