D. Min Cost String
题目大意
定义一个字符串,如果满足s[i]=s[j]并且s[i+1]=s[j+1],那么就有一个价值,要求给你一个k表示只能使用前k个字母,构造出长度为n的字符串,使其价值最小。
思路
由于你只能用前k个字母,把么第一层放由a到a+k的字母,第二层交叉着放第上一维的字母和当前遍历到的前k个字母,这样可以拿到最小的价值。
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimization ("unroll-loops")
using namespace std;
#define ll long long
#define sl(n) scanf("%lld",&n)
#define pl(n) printf("%lld",n)
#define sdf(n) scanf("%lf",&n)
#define pdf(n) printf("%.lf",n)
#define pE printf("\n")
#define ull unsigned long long
#define pb push_back
#define debug(a) cout<<a<<"??"
#define me(a) memset(a,0,sizeof(a))
#define pre(n) for(ll i=1;i<=n;i++)
#define rep(n) for(ll i=n;i>=1;i--)
#define ph push
#define pi pair<ll,ll>
#define fi first
#define se second
const ll mod = 1e9 + 7;
void solve(){
ll n,k;
cin>>n>>k;
string s;
for(int i=0;i<k;i++){
s+='a'+i;
for(int j=i+1;j<k;j++){
s+='a'+i;
s+='a'+j;
}
}
while(s.size()<n)s+=s;
s.resize(n);
cout<<s<<endl;
}
int main()
{
solve();
return 0;
}