题目
链接:https://www.luogu.com.cn/problem/P6101
思路分析
还是挺好想的:就是找出目前字符数最多的一种字符,然后再不停的*2,直到超过要求的数目。主要是这道题会爆ll,只能用__int128,主要是要记住模板:
完整代码
#include <iostream>
#include <map>
#include <cstdio>
#include<cstring>
using namespace std;
typedef unsigned long long ull;
inline void read(__int128 &X)
{
X = 0;
int w=0; char ch=0;
while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
if (w) X = -X;
}
void print(__int128 x)
{
if (!x) return ;
if (x < 0) putchar('-'),x = -x;
print(x / 10);
putchar(x % 10 + '0');
}
int main()
{
ios::sync_with_stdio(false);
char str[1000005];
__int128 l;
map<char,ull> counter;
scanf("%s",str);
read(l);
ull len=strlen(str);
if(len>=l)
{
cout<<"0"<<endl;
return 0;
}
for(ull i=0;i<len;i++)
{
counter[str[i]]++;
}
ull maxn=0;
for(map<char,ull>::iterator it=counter.begin();it!=counter.end();it++)
{
maxn=max(it->second,maxn);
}
__int128 xu=l-len;
__int128 pl=maxn;
__int128 ans=0;
do{
pl=pl*2;
ans++;
}while(pl-maxn<xu);
print(ans);
return 0;
}