并没有报codeforce 但有人想让我帮他看题,于是就做了
大概意思就是,给你200个空,让你在200个空中放字母, 再自己设计一个串,要求自己设计的这个串在这放着200个字母的串中作为子串出现n次
input: 3
output: abbbc*196(abbb后面跟着196个c) ab
一开始肯定想到乘法原理,当每个字母按顺序出现时就是每个字母出现次数的乘积
但n可能不会拆为4个和小于200的数的乘积,所以就需要普适的方法
然后由于每个字母只和它前面的字母有关,和后面的无关,所以就满足一定dp的性质 。就可以转成进制数相关的东西
于是打算用abcdefg...等的方式循环,将对答案用最后一个字母表示出来
于是就打出了这样一个表:
于是发现,在字母数为10个时,只需循环11层就可以出可行方案了
占用的字母空间不会超过150、
码(其丑无比):
#include<iostream>
#include<cstdio>
using namespace std;
int jilu[12],n,i,j,cnt;
int main()
{
scanf("%d",&n);
while(n>=92378)
{
jilu[10]++;
n-=92378;
}
while(n>=48620)
{
jilu[9]++;
n-=48620;
}
while(n>=24310)
{
jilu[8]++;
n-=24310;
}
while(n>=11440)
{
jilu[7]++;
n-=11440;
}
while(n>=5005)
{
jilu[6]++;
n-=5005;
}
while(n>=2002)
{
jilu[5]++;
n-=2002;
}
while(n>=715)
{
jilu[4]++;
n-=715;
}
while(n>=220)
{
jilu[3]++;
n-=220;
}
while(n>=55)
{
jilu[2]++;
n-=55;
}
while(n>=10)
{
jilu[1]++;
n-=10;
}
while(n>=1)
{
jilu[0]++;
n-=1;
}
for(i=0;i<=10;i++)
{
cout<<"abcdefghi";
cnt+=9;
for(j=1;j<=jilu[i];j++)cout<<"j";
cnt+=jilu[i];
}
for(i=1;i<=200-cnt;i++)cout<<"k";
cout<<" abcdefghij";
}