[codeforces 1368B] Codeforces Subsequences 乘法原理

Codeforces Global Round 8  参与排名人数13404

[codeforces 1368B]    Codeforces Subsequences    乘法原理

总目录详见https://blog.csdn.net/mrcrack/article/details/103564004

在线测评地址https://codeforces.com/contest/1368/problem/B

Problem Lang Verdict Time Memory
B - Codeforces Subsequences GNU C++17 Accepted 31 ms 200 KB

题目大意:给出字符串,统计子串(子串字母可以跳跃)是codeforces的数量。

本题要求,给出子串最少数量k,构造字符串s,要求字符串s包含的字母数量最少,输出这个最少的字符串s.

关键语句如下

Help Karl find any shortest string that contains at least k codeforces subsequences.此句十分关键at least k至少k个

数据构造如下

1
codeforces
有1个子串codeforces

2
ccodeforces
有2个子串codeforces

3
ccoodeforces
有2*2=4个子串codeforces
4>=3

4
ccoodeforces
有4个子串codeforces
4>=4

5
ccoodeforces
有2*2*2=8个子串ccooddeforces
8>=5


程序模拟如下

3000

2^10=1024
3^10=59049
2^10<3000<3^10

3*2^9=1536
3*3*2^8=2304
3*3*3*2^7=3456  3456>2000

对应字串如下
cccooodddeeffoorrcceess

根据上述过程,编出以下代码

#include 
#define LL long long
char s[20]="0codeforces";//codeforces有10个字母
int num[20];
int main(){
	LL k,a,b;
	int i,j;
	scanf("%lld",&k);
	for(i=1;i<=40;i++){//40^10>10^16
		a=1;
		for(j=1;j<=10;j++)a=a*i;//此处计算a=i^10
		if(a>k)break;
	}
	i--,b=i,a=1;//保证i^10<=k
	for(i=1;i<=10;i++)a=a*b;//计算a=b^10
	for(i=1;i<=10;i++)num[i]=b;//让每一位上的字符个数是b
	for(i=1;i<=10;i++)
		if(a>=k)break;
		else a/=b,a*=(b+1),num[i]=b+1;//b+1表示让因数增加1
	for(i=1;i<=10;i++)
		for(j=1;j<=num[i];j++)printf("%c",s[i]);//打印字符
	printf("\n");
	return 0;
}

 

你可能感兴趣的:(codeforces)